ОБНОВЛЕНИЕ: Я открыл вопрос, пожалуйста, запустите его, если вы испытываете ту же проблему. http://code.google.com/p/android/issues/detail?id=28016Дублирующие элементы в виджетах GridView
У меня есть приложение с сеткой на нем.
Когда я начинаю добавлять элементы в свой виджет, почти всегда я получаю первые предметы, показанные дважды (вместо отображения первого элемента и второго элемента).
Если у меня есть намерение обновления виджета, проблема будет исправлена и никогда не вернется (при условии, что у меня уже есть два элемента в моем gridview).
Но это всегда происходит при добавлении первых двух предметов.
Любые идеи, что это может быть?
UPDATE: Я только что заметил, что это всегда происходит, когда новый элемент добавляется в GridView. Если я обновляю виджет без добавления нового элемента, то он отлично работает.
Еще одна вещь, которую я видел, это то, что метод getViewAt всегда вызывается дважды для первого элемента (позиция нуля). Может быть, это связано?
Я последовал за образец здесь довольно тесно: http://developer.android.com/resources/samples/WeatherListWidget/src/com/example/android/weatherlistwidget/WeatherWidgetService.html
Вот мой RemoteViewsService, я думаю, что это соответствующая часть, но я не уверен, что на самом деле. Что еще может повлиять на это?
упаковка com.manor.TestApp;
общественного класса TestAppRemoteViewsService расширяет RemoteViewsService {
@Override
общественного RemoteViewsFactory onGetViewFactory (Intent намерения) {
возвратный новый TestAppViewsFactory (this.getApplicationContext(), намерения); }}
класс TestAppViewsFactory реализует RemoteViewsService.RemoteViewsFactory {
частный Контекст mContext;
// private int mAppWidgetId;
приватное TestDb mDb = null;
частный int mCount = 0;
приватная строка [] 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 (промежуточное положение) {
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 общественных недействительный 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 public long getItemId (int pos) { return pos; }
@Override public boolean hasStableIds() { return false; }
}
введите класс источника, который называется getViewAt() – Rudy
@Rudy - фреймворк вызывает getViewAt – Ran
Я не считаю его ошибкой – Sameer