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

上一篇: Duplicate items in GridView widget

下一篇: Android registerForContextMenu out of an Activity