信息亦中方范信范范范范范范范范范范范范范范 [英] Android widget List view showing same content for every item
本文介绍了信息亦中方范信范范范范范范范范范范范范范范的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
但是对于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屋!
查看全文