Android widget List view showing same content for every item

泪湿孤枕 提交于 2019-12-10 10:42:50

问题


I am trying to implement listView widget by using data returned from firebase.

But for every item in listview I only see the first data row from firebase and I am not able to figure out why.

i tried debugging I am getting unique data in

datasnapshot

My code is

Widgetservice.java

public class WidgetService extends RemoteViewsService {


@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
    int appWidgetId = intent.getIntExtra(
            AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);

    return (new ListProvider(this.getApplicationContext(), intent));
}

}

WidgetProvider.java

public class WidgetProvider extends AppWidgetProvider {

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                     int[] appWidgetIds) {
    final int N = appWidgetIds.length;
    /*int[] appWidgetIds holds ids of multiple instance of your widget
     * meaning you are placing more than one widgets on your homescreen*/
    for (int i = 0; i < N; ++i) {
        RemoteViews remoteViews = updateWidgetListView(context,
                appWidgetIds[i]);
        appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
    }
    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

private RemoteViews updateWidgetListView(Context context, int appWidgetId) {

    //which layout to show on widget
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.widget_layout);

    //RemoteViews Service needed to provide adapter for ListView
    Intent svcIntent = new Intent(context, WidgetService.class);
    //passing app widget id to that RemoteViews Service
    svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    //setting a unique Uri to the intent
    //don't know its purpose to me right now
    svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
    //setting adapter to listview of the widget
    remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget,
            svcIntent);
    //setting an empty view in case of no data
    remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view);
    return remoteViews;
}

}

ListProvider.java

public class ListProvider implements RemoteViewsFactory {
private ArrayList<ListItem> listItemList = new ArrayList<ListItem>();
private Context context = null;
private int appWidgetId;

private DatabaseReference mFirebaseDatabaseReference;
private FirebaseAuth mFirebaseAuth;
private FirebaseUser mFirebaseUser;

public ListProvider(Context context, Intent intent) {
    this.context = context;
    appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);


}

private void populateListItem() {


    Firebase ref = new Firebase("https://helpplusapp-318b8.firebaseio.com/HomeContent");
    mFirebaseAuth = FirebaseAuth.getInstance();
    mFirebaseUser = mFirebaseAuth.getCurrentUser();

    DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("HomeContent");
    mDatabaseReference.addValueEventListener(new ValueEventListener() {
        ListItem listItem;
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            listItem = new ListItem();
            System.out.println("There are " + dataSnapshot.getChildrenCount() + " blog posts");
            for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
                HomeSampleContent post = postSnapshot.getValue(HomeSampleContent.class);


                listItem.setContent("Heading"+post.getHomeContent());
                listItem.setHeading("this is heading");
                listItemList.add(listItem);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

@Override
public int getCount() {
    return listItemList.size();
}

@Override
public long getItemId(int position) {
    return position;
}

/*
 *Similar to getView of Adapter where instead of View
 *we return RemoteViews
 *
 */
@Override
public RemoteViews getViewAt(int position) {
    final RemoteViews remoteView = new RemoteViews(
    context.getPackageName(), R.layout.list_row);
    ListItem listItem = listItemList.get(position);
    remoteView.setTextViewText(R.id.heading, listItem.getContent());
    remoteView.setTextViewText(R.id.content, listItem.getHeading());

    return remoteView;
}


@Override
public RemoteViews getLoadingView() {
    return null;
}

@Override
public int getViewTypeCount() {
    return 1;
}

@Override
public boolean hasStableIds() {
    return true;
}

@Override
public void onCreate() {
}

@Override
public void onDataSetChanged() {
    populateListItem();
}

@Override
public void onDestroy() {
}

}

Please help!

Thanks in advance.


回答1:


listItem = new ListItem(); should be inside for loop:

@Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        System.out.println("There are " + dataSnapshot.getChildrenCount() + " blog posts");
        for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {listItem = new ListItem();
            HomeSampleContent post = postSnapshot.getValue(HomeSampleContent.class);


            listItem.setContent("Heading"+post.getHomeContent());
            listItem.setHeading("this is heading");
            listItemList.add(listItem);
        }
    }


来源:https://stackoverflow.com/questions/39005779/android-widget-list-view-showing-same-content-for-every-item

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!