Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GridView小部件中的重复项_Android_Android Appwidget_Android Gridview - Fatal编程技术网

Android GridView小部件中的重复项

Android GridView小部件中的重复项,android,android-appwidget,android-gridview,Android,Android Appwidget,Android Gridview,更新:我打开了一个问题,如果您遇到相同的问题,请启动它。 我有一个带有gridview的appwidget 当我开始向我的小部件添加项目时,几乎总是会显示两次第一个项目(而不是显示第一个项目和第二个项目) 如果我做了一个widget更新,那么问题就被修复了,永远不会返回(假设我的gridview上已经有两个项目) 但在添加前两项时,总是会发生这种情况 有什么想法吗 更新:我刚刚注意到,当一个新项目添加到GridView时,总是会发生这种情况。如果我在不添加新项的情况下刷新小部件,那么它工作正常

更新:我打开了一个问题,如果您遇到相同的问题,请启动它。

我有一个带有gridview的appwidget

当我开始向我的小部件添加项目时,几乎总是会显示两次第一个项目(而不是显示第一个项目和第二个项目)

如果我做了一个widget更新,那么问题就被修复了,永远不会返回(假设我的gridview上已经有两个项目)

但在添加前两项时,总是会发生这种情况

有什么想法吗

更新:我刚刚注意到,当一个新项目添加到GridView时,总是会发生这种情况。如果我在不添加新项的情况下刷新小部件,那么它工作正常

我看到的另一件事是,对于第一项(位置0),getViewAt方法总是被调用两次。也许有关系

我非常仔细地跟踪了这里的样本:

这是我的RemoteViews服务,我想这是相关的部分,但实际上我不确定。 还有什么可以影响它

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;
    }
}

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

GridView或其任何父容器的高度或小部件是否设置为包装内容

经过几天的反复试验,我想我已经用ListView解决了一个类似的问题,将其高度从wrap\u content更改为match\u parent。更改后(到目前为止),我无法重现该问题


我发现了一段视频,解释了为什么wrap_内容对ListView不好:。也许GridView也是如此。

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

对于支持字符串数组,将它们强散列为long,或者保留
(long id,String data)
对可能会有所帮助

下面是哈希的示例代码。我使用的是Hashing,但是这个概念是通用的

@Override
public long getItemId(int position) {
    return Hashing.sha1().hashString(mData[position]).asLong();
}

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

将调用getViewAt()@Rudy的源类放入框架-框架正在调用getViewAtI,但没有。。所有内容都是匹配父项或特定大小,没有包装内容。
@Override
public long getItemId(int position) {
    return Hashing.sha1().hashString(mData[position]).asLong();
}