6

更新:問題を開きました。同じ問題が発生している場合は、スターを付けてください。 http://code.google.com/p/android/issues/detail?id=28016

グリッドビューを備えた appwidget があります。

ウィジェットにアイテムを追加し始めると、ほとんどの場合、最初のアイテムが 2 回表示されます (最初のアイテムと 2 番目のアイテムが表示されるのではなく)。

ウィジェット更新インテントを実行すると、問題は修正され、返されません (グリッドビューに既に 2 つのアイテムがあると仮定します)。

ただし、最初の 2 つの項目が追加されると常に発生します。

それが何であるかについてのアイデアはありますか?

更新:新しい項目が GridView に追加されると、常に発生することに気付きました。新しいアイテムを追加せずにウィジェットを更新すると、正常に動作します。

私が見たもう 1 つのことは、getViewAt メソッドが最初のアイテム (位置ゼロ) に対して常に 2 回呼び出されることです。もしかして関係ある?

私はここのサンプルに非常に厳密に従った: 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 に設定されていますか?

何日もの試行錯誤の後、高さをwrap_contentからmatch_parentに変更することで、ListView の同様の問題を修正したと思います。変更後(今のところ)問題を再現できていません。

wrap_content が ListView に適していない理由を説明するビデオを見つけました: http://www.youtube.com/watch?v=wDBM6wVEO70&t=40m45s。おそらく、GridViews についても同様です。

于 2012-04-17T21:20:43.477 に答える
1

数回の試行と Google での 1 か月の検索の後、今日、解決策を見つけました。リストビューでイメージビューを使用する場合、getViewAt 呼び出しごとにすべてのイメージビューを開始する必要があります。それぞれの場合にイメージビューの選択を調整しましたが、初期化を忘れていました。getViewAt で、コンテンツのない透明な画像を割り当てました。問題が解決しました。

于 2013-06-09T07:08:21.130 に答える
1

@Nikoのコメントと同様に、IDをアイテムごとに一意に変更するまで、この問題がありました。

(long id, String data)文字列のバッキング配列の場合、それらを long に強力にハッシュするか、代わりにペアを維持することが役立つ場合があります。

ハッシュのコード例を次に示します。Google Guavaのを使用していますHashingが、概念は一般的です。

@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 に答える