Если вы все еще не нашли решение, вот мое.
Вам нужна CustomGallery, которая по умолчанию составляет почти 1: 1 Android Gallery. Но вы не можете расширить галерею, вы должны скопировать весь исходный код в свой класс. Вам нужно будет сделать то же самое с классами CustomAbsSpinner и CustomAdapterView. Все это, чтобы изменить только одну строку кода ...
В вашем классе CustomGallery измените метод onLayout () на этот:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
/*
* Remember that we are in layout to prevent more layout request from
* being generated.
*/
mInLayout = true;
/*
* Add if condition to avoid calling layout() unnecessarily:
* -when children calls onLayout after loading imageview
*/
if(changed || mDataChanged)
layout(0, false);
mInLayout = false;
}
Это приведет к тому, что layout()
вызывается только тогда, когда это действительно необходимо.
Была также другая известная ошибка в поведении галереи, которая вызывает скачки галереи на notifyDataSetChanged()
. Если у вас также есть эта ошибка, просто закомментируйте одну строку в классе CustomAdapterView:
@Override
public void onChanged() {
mDataChanged = true;
mOldItemCount = mItemCount;
mItemCount = getAdapter().getCount();
// Detect the case where a cursor that was previously invalidated has
// been repopulated with new data.
if (CustomAdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
&& mOldItemCount == 0 && mItemCount > 0) {
CustomAdapterView.this.onRestoreInstanceState(mInstanceState);
mInstanceState = null;
} else {
rememberSyncState();
}
checkFocus();
//comment this line to avoid gallery snap on notyfiDataSetChanged
//requestLayout();
}
В любом случае, хорошая тема Маркос! Спасибо за то, что привели меня к решению.
Если вам нужен источник пользовательских классов, дайте мне знать.
РЕДАКТИРОВАТЬ (автор Маркос Васконселос):
Существует множество стилей, которые нужно скопировать, чтобы получить исправление R для этих классов.
Для тех, кто ищет исходный код Android 2.2 (без папки res, если кто-то нашел его, пожалуйста, сообщите нам), это можно найти здесь:
http://en.newinstance.it/2010/12/01/android-sdk-2-2_r2-sources/
Для более поздних версий API это можно сделать через SDK Manager, и он будет расположен в / sources / android-