6

更新:我打开了一个问题,如果您遇到同样的问题,请给它加星标。 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;
    }
}
4

4 回答 4

3

GridView 或其任何父容器的高度或小部件是否设置为 wrap_content?

经过多天的反复试验,我想我通过将 ListView 的高度从wrap_content更改为match_parent解决了类似的问题。更改后我无法重现该问题(到目前为止)。

我找到了一个视频,解释了为什么 wrap_content 对 ListView 不利:http ://www.youtube.com/watch?v=wDBM6wVEO70&t=40m45s 。也许它与 GridViews 类似。

于 2012-04-17T21:20:43.477 回答
1

经过几次试验和一个月的谷歌搜索,今天我找到了解决方案。在列表视图中使用图像视图时,您应该在每次 getViewAt 调用时启动每个图像视图。我在每种情况下都调整了图像视图选择,但忘记了初始化。在 getViewAt 我分配了一个没有内容的透明图像。问题解决了。

于 2013-06-09T07:08:21.130 回答
1

与@Niko 的评论类似,我遇到了这个问题,直到我将 ID 更改为每个项目都是唯一的。

对于字符串的后备数组,将它们强烈散列为 long 或保留(long id, String data)对可能会有所帮助。

这是散列的示例代码。我正在使用Google GuavaHashing,但这个概念很笼统。

@Override
public long getItemId(int position) {
    return Hashing.sha1().hashString(mData[position]).asLong();
}
于 2012-07-03T19:59:06.303 回答
0
@Override public long getItemId(int pos) { return pos; }

@Override public boolean hasStableIds() { return false; }

不确定这是否与问题有关,但该示例已为 hasStableIds() 返回 true

于 2012-03-29T16:32:27.457 回答