信息亦中方范信范范范范范范范范范范范范范范 [英] Android widget List view showing same content for every item

查看:262
本文介绍了信息亦中方范信范范范范范范范范范范范范范范的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图通过使用从firebase返回的数据来实现listView小部件。

但是对于listview中的每个项目,我只能看到来自firebase的第一个数据行,而我

我试着调试我在


中获取唯一的数据 datasnapshot

我的代码是

Widgetservice.java p>

  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));

code










$ b $ p


$ b

WidgetProvider.java

  public class WidgetProvider extends AppWidgetProvider {

@Override
public void onUpdate (上下文上下文,AppWidgetManager appWidgetManager,
int [] appWidgetIds){
final int N = appWidgetIds.length;
/ * int [] appWidgetIds保存你的widget的多个实例的id
*表示你在主屏幕上放置了多个widgets * /
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){

//显示在窗口小部件上的布局
RemoteViews remoteViews = new RemoteViews( context.getPackageName(),
R.layout.widget_layout);

// RemoteViews服务需要为ListView提供适配器
Intent svcIntent = new Intent(context,WidgetService.class);
//将应用程序窗口小部件ID传递给RemoteViews服务
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);
//为意图设置一个唯一的Uri
//不知道它的目的是什么
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)) );
//将适配器设置为widget的列表视图
remoteViews.setRemoteAdapter(appWidgetId,R.id.listViewWidget,
svcIntent);
//在没有数据的情况下设置一个空视图
remoteViews.setEmptyView(R.id.listViewWidget,R.id.empty_view);
返回remoteViews;

code










$ b $ p


$ b

ListProvider.java

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

private DatabaseReference mFirebaseDatabaseReference;
私人FirebaseAuth mFirebaseAuth;
私有FirebaseUser mFirebaseUser;

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



$ b 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(); $ (DataSnapshot postSnapshot:dataSnapshot.getChildren()){
HomeSampleContent post = postSnapshot(DataSnapshot.getChildrenCount()+blogs);
.getValue(HomeSampleContent.class);


listItem.setContent(Heading+ post.getHomeContent());
listItem.setHeading(this is heading);
listItemList.add(listItem);
}
}
$ b $ @覆盖
public void onCancelled(DatabaseError databaseError){

}
});


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

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

$ b $ * b $ b *类似getView的Adapter而不是View
*我们返回RemoteViews
*
* /
@Override
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());

返回remoteView;
}


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

@Override
public int getViewTypeCount(){
return 1;


@Override
public boolean hasStableIds(){
return true;

$ b @Override
public void onCreate(){
}

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

$ b @Override
public void onDestroy(){
}

}

请帮忙!

在此先感谢。

解决方案

listItem = new ListItem();应该在循环里面:

  @Override 
public void onDataChange(DataSnapshot dataSnapshot){

System.out.println(还有+ dataSnapshot.getChildrenCount()+博客文章); (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);
}
}


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.

解决方案

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);
        }
    }

这篇关于信息亦中方范信范范范范范范范范范范范范范范的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆