2014-01-27 18 views
9

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

+0

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

Antwort

5

Ich habe das Problem herausgefunden. Es stellt sich heraus, dass ich die Anzahl der Ansichten, in denen mein Fall 1 ist, die ich in getViewTypeCount() in meiner WidgetRemoteViewsFactory-Klasse habe, zurückgeben muss.

+0

Ich habe das gleiche Problem und unser Code ist fast der gleiche, aber ich bekomme meine Daten von einem Web-Service. Ich setze mein 'getViewTypeCount', um 1 auch zurückzugeben, aber meine' ListView' zeigt noch keine Artikel an. Kannst du mir helfen? http://stackoverflow.com/questions/39266206/items-on-listview-in-widget-doesnt-display-android Danke. – natsumiyu