GridView小部件中的重复项目
更新:我打开了一个问题,如果遇到同样的问题,请将其列出。 http://code.google.com/p/android/issues/detail?id=28016
我有一个gridview的appwidget。
当我开始向我的小部件添加项目时,几乎总是会显示两次第一项(而不是显示第一项和第二项)。
如果我做一个小部件更新意图,那么问题就解决了,并且永远不会返回(假设我的gridview已经有两个项目)。
但是当前两个项目被添加时总会发生。
任何想法可能是什么?
更新:我刚刚注意到,当一个新项目添加到GridView时,它总是发生。 如果我在不添加新项目的情况下刷新小部件,那么它工作正常。
我看到的另一件事是getViewAt方法总是被调用两次为第一个项目(位置零)。 也许它是相关的?
我在这里非常仔细地跟踪了这个示例:http://developer.android.com/resources/samples/WeatherListWidget/src/com/example/android/weatherlistwidget/WeatherWidgetService.html
这里是我的RemoteViewsService,我认为这是相关部分,但我不确定。 还有什么可以影响它?
包com.manor.TestApp;
公共类TestAppRemoteViewsService扩展RemoteViewsService {
@覆盖
public RemoteViewsFactory onGetViewFactory(Intent intent){
返回新的TestAppViewsFactory(this.getApplicationContext(),intent); }
}
类TestAppViewsFactory实现RemoteViewsService.RemoteViewsFactory {
private Context mContext;
// private int mAppWidgetId;
私人TestDb mDb = null;
private int mCount = 0;
private String [] mData;
public TestAppViewsFactory(Context context,Intent intent){mContext = context;
/*mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);*/
}
@Override public void onCreate(){
mDb = new TestDb(mContext);
mDb.open(false);
}
@Override public void onDestroy(){
if (mDb != null)
mDb.close();
}
@Override public int getCount(){
Log.d("TestApp", "getCount: " + Integer.toString(mCount));
return mCount;
}
@Override public RemoteViews getViewAt(int position){
Log.d("TestApp", "pos: " + Integer.toString(position));
if (position >= mData.length)
return null;
Log.d("TestApp", "p: " + mData[position]);
/*if (position > 0) {
Log.d("TestApp", "here");
}*/
SharedPreferences sharedPreferences =
>mContext.getSharedPreferences(TestAppPreferenceActivity.SHARED_PREFS_NAME, 0);
RemoteViews rv = new RemoteViews(mContext.getPackageName(), >R.layout.widget_item);
// --- set text and image to remoteviews ---
return rv;
}
@Override public RemoteViews getLoadingView(){return null; }
@Override public void onDataSetChanged(){SharedPreferences sharedPreferences =
mContext.getSharedPreferences(TestAppPreferenceActivity.SHARED_PREFS_NAME,0);
String[] strs = mDb.getData();
if (strs == null) {
mCount = 0;
return;
}
// -- fills mData from mDb --
mCount = mData.length;
}
@Override public int getViewTypeCount(){return 1; }
@Override public long getItemId(int pos){return pos; }
@Override public boolean hasStableIds(){return false; }
}
您的GridView或其父容器的高度或小部件是否设置为wrap_content?
经过多日的反复试验,我认为我通过将它的高度从wrap_content更改为match_parent来解决了类似的问题。 在改变之后(到目前为止)我还没有能够重现问题。
我发现了一个视频,解释了为什么wrap_content对于ListView的不好:http://www.youtube.com/watch?v=wDBM6wVEO70&t=40m45s。 也许它也适用于GridViews。
类似@ Niko的评论,我有这个问题,直到我改变ID为每个项目的唯一。
对于字符串的后备数组,强制将它们散列为long,或者保留(long id, String data)
对可能会有所帮助。
这里是哈希的示例代码。 我正在使用Google Guava的Hashing
,但概念是一般的。
@Override
public long getItemId(int position) {
return Hashing.sha1().hashString(mData[position]).asLong();
}
经过几次试验和谷歌搜索一个月后,今天我找到了解决方案。 在listview中使用图像视图时,应该在每个getViewAt调用中启动每个imageview。 我已经在每种情况下调整了imageview选择,但忘记了初始化。 在getViewAt我分配了一个没有内容的透明图像。 问题解决了。
链接地址: http://www.djcxy.com/p/50595.html