更新:問題を開きました。同じ問題が発生している場合は、スターを付けてください。 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;
}
}