Ich entwickle gerade ein Android-Projekt, das ein Homescreen-Widget verwendet, um Daten für den Benutzer anzuzeigen. Die Ansicht, die ich im Widget verwendet habe, ist eine ListView
. Hier sind meine Codes:Wie Artikel in Android Homescreen Listview Widget laden?
WidgetService Klasse
public class WidgetService extends RemoteViewsService
{
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent)
{
return (new WidgetRemoteViewsFactory(this.getApplicationContext(), intent));
}
}
WidgetProvider Klasse
public class WidgetProvider extends AppWidgetProvider
{
@Override
public void onDeleted(Context context, int[] appWidgetIds)
{
super.onDeleted(context, appWidgetIds);
}
@Override
public void onDisabled(Context context)
{
super.onDisabled(context);
}
@Override
public void onEnabled(Context context)
{
super.onEnabled(context);
}
@Override
public void onReceive(Context context, Intent intent)
{
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds)
{
for(int i=0;i<appWidgetIds.length;i++)
{
RemoteViews rv = new RemoteViews(context.getPackageName(),
R.layout.widget);
Intent intent = new Intent(context, WidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
appWidgetIds[i]);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
rv.setRemoteAdapter(R.id.widgetListView, intent);
appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
WidgetRemoteViewsFactory Klasse
public class WidgetRemoteViewsFactory implements RemoteViewsFactory
{
private Context context = null;
private int appWidgetId;
private List<String> widgetList = new ArrayList<String>();
private DBHelper dbhelper;
public WidgetRemoteViewsFactory(Context context, Intent intent)
{
this.context = context;
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
Log.d("AppWidgetId", String.valueOf(appWidgetId));
dbhelper = new DBHelper(this.context);
}
private void updateWidgetListView()
{
String[] widgetFruitsArray = dbhelper.retrieveFruitsList();
List<String> convertedToList = new ArrayList<String>(Arrays.asList(widgetFruitsArray));
this.widgetList = convertedToList;
}
@Override
public int getCount()
{
return widgetList.size();
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public RemoteViews getLoadingView()
{
// TODO Auto-generated method stub
return null;
}
@Override
public RemoteViews getViewAt(int position)
{
Log.d("WidgetCreatingView", "WidgetCreatingView");
RemoteViews remoteView = new RemoteViews(context.getPackageName(),
R.layout.listview_row_item);
Log.d("Loading", widgetList.get(position));
remoteView.setTextViewText(R.id.listTV, widgetList.get(position));
return remoteView;
}
@Override
public int getViewTypeCount()
{
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean hasStableIds()
{
// TODO Auto-generated method stub
return false;
}
@Override
public void onCreate()
{
// TODO Auto-generated method stub
updateWidgetListView();
}
@Override
public void onDataSetChanged()
{
// TODO Auto-generated method stub
updateWidgetListView();
}
@Override
public void onDestroy()
{
// TODO Auto-generated method stub
widgetList.clear();
dbhelper.close();
}
}
Android Manifestdatei
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.listviewwithdb"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/MyTheme.Light" >
<activity
android:name="com.example.listviewwithdb.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.example.listviewwithdb.WidgetProvider" >
<intent-filter >
<action
android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widgetinfo" />
</receiver>
<service
android:name="com.example.listviewwithdb.WidgetService"
android:exported="false"
android:permission="android.permission.BIND_REMOTEVIEWS" />
</application>
</manifest>
Das Problem ist, dass ich das Widget in den Homescreen hinzufügen kann, aber es zeigt die Liste der Artikel in der Listenansicht mit einem „Loading ..“ Meldung in der es, ich versuchte, Protokollieren Sie die Werte bei getViewAt()
wie oben gezeigt, und es zeigt den Inhalt an, den ich erfolgreich möchte. Gibt es etwas, das mir in meinen Codes fehlt, das das Problem verursacht? Danke für die Hilfe im Voraus
Hallo, ich bekomme auch das gleiche Problem. kannst du mir helfen, wenn du eine Lösung davon hast. kannst du mir den running code von diesem und ho schicken um kist item klickbar zu machen? Bitte helfen Sie mir, wenn Sie eine Lösung davon haben – Anshul