更新:我打开了一个问题,如果您遇到同样的问题,请为其加注星标。 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,我认为这是相关部分,但实际上我并不确定。 还有什么可以影响它?
package com.manor.TestApp;
public class TestAppRemoteViewsService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new TestAppViewsFactory(this.getApplicationContext(), intent);
}
}
class TestAppViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private Context mContext;
//private int mAppWidgetId;
private 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;
}
}
答案 0 :(得分:3)
GridView或其任何父容器的高度或小部件是否设置为wrap_content?
经过多天的反复试验,我认为我通过将其高度从 wrap_content 更改为 match_parent 来修复与ListView类似的问题。我无法在更改后重现问题(到目前为止)。
我找到了一个视频,解释了为什么wrap_content对ListView的错误:http://www.youtube.com/watch?v=wDBM6wVEO70&t=40m45s。也许它与GridViews类似。
答案 1 :(得分:1)
与@ Niko的评论相似,我遇到了这个问题,直到我将每个项目的ID更改为唯一。
对于字符串的后备数组,强烈地将它们散列为long,或者保留(long id, String data)
对可能有帮助。
这是哈希的示例代码。我使用Google Guava' Hashing
,但这个概念很普遍。
@Override
public long getItemId(int position) {
return Hashing.sha1().hashString(mData[position]).asLong();
}
答案 2 :(得分:1)
经过几次试验和谷歌搜索一个月后,今天我找到了解决方案。在listview中使用imageviews时,您应该在每次getViewAt调用时启动每个imageview。我已经在每种情况下调整了imageview选择,但忘了初始化。在getViewAt,我分配了一个没有内容的透明图像。问题解决了。
答案 3 :(得分:0)
@Override public long getItemId(int pos) { return pos; }
@Override public boolean hasStableIds() { return false; }
不确定这是否与问题有关,但示例已为hasStableIds()
返回true