2012-03-22 6 views
6

更新:同じ問題が発生した場合は、問題が発生しました。 GridViewウィジェットの重複するアイテム

私はそれにgridviewを持つappwidgetを持っています。

ウィジェットにアイテムを追加すると、ほとんどの場合、最初のアイテムが2回表示されます(最初のアイテムと2番目のアイテムを表示する代わりに)。

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

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

何ができますか?

更新日:私は、新しいアイテムがGridViewに追加されたときにいつもそれが起こることに気付きました。新しいアイテムを追加せずにウィジェットを更新すると、正常に動作します。

私が見たもう一つのことは、getViewAtメソッドは常に最初の項目(位置0)に対して2回呼び出されることです。多分それは関連しているでしょうか?

私はかなり密接にここにサンプルを追っ: http://developer.android.com/resources/samples/WeatherListWidget/src/com/example/android/weatherlistwidget/WeatherWidgetService.html

をここでは私のRemoteViewsServiceですが、私はこれが関連する部分だと思うが、私は実際にはわかりません。 他に何が影響を与えることができますか?

package com.manor.TestApp;

パブリッククラスTestAppRemoteViewsServiceはRemoteViewsService {

@Override
公共RemoteViewsFactory onGetViewFactory(テントの意図){
リターン新しいTestAppViewsFactory(this.getApplicationContext()、インテント)に延びています。 }

}

クラスTestAppViewsFactoryはRemoteViewsServiceを実装します。RemoteViewsFactory {

プライベートコンテキストmContext;

// private int mAppWidgetId;

private TestDb mDb = null;

private int mCount = 0;

プライベートString [] mData;

public TestAppViewsFactory(コンテキストコンテキスト、意図インテント){ mContext = context;

/*mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
      AppWidgetManager.INVALID_APPWIDGET_ID);*/ 

}

@Override公共ボイドのonCreate(){

mDb = new TestDb(mContext); 

    mDb.open(false); 

}

@Override公共ボイドonDestroy(){

if (mDb != null) 

     mDb.close(); 

}

@Override公共INT同様にgetCount(){

Log.d("TestApp", "getCount: " + Integer.toString(mCount)); 

    return mCount; 

}

@Override公共RemoteViews getViewAt(INT位置){

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(){ 戻り値はnullです。 }

@Override 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公共INT getViewTypeCount(){ リターン1。 }

@Override公共長いgetItemId(int型POS){ 戻りPOS。 }

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

}

+0

getViewAtと呼ばれるソースクラス() – Rudy

+0

@Rudyを置く - フレームワークは、私はその私は真実でもユニークなIDを持つとそれを試してみましたバグ – Ran

+0

を呼んでいます。いいえ... – Sameer

答えて

0
@Override public long getItemId(int pos) { return pos; } 

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

これは問題とは何かを持っていますが、一例は、hasStableIds()

+1

思いscroll down toパソコンへ転送getViewAt – Ran

3

があなたのGridViewの高さやウィジェットですためにtrueを返したかどうかわかりませんまたはその親コン​​テナのいずれかがwrap_contentに設定されていますか?

試行錯誤の多くの日後、私は私がwrap_contentにmatch_parentからその高さを変更することにより、ListViewコントロールと同様の問題を修正だと思います。私は変更後の問題を再現できませんでした(これまでのところ)。

なぜwrap_contentがListViewのために悪いのかを説明するビデオが見つかりました:http://www.youtube.com/watch?v=wDBM6wVEO70&t=40m45s。多分GridViewsのための同様の。

+0

私はこれを望んでいましたが、何もありません。すべてがmatch_parentまたは特定のサイズで、wrap_contentはありません。 – Ran

1

@ Nikoのコメントと同様に、IDを項目ごとに一意に変更するまでは、この問題が発生しました。

文字列のバッキング配列の場合、強くハッシュしたり、(long id, String data)のペアを保持しておくと効果的です。

ここでは、ハッシングのコード例を示します。私はGoogle GuavaHashingを使っていますが、その概念は一般的です。

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

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

関連する問題