#android #android-layout #android-recyclerview
#Android #android-макет #android-recyclerview
Вопрос:
Редактировать: если у кого-то возникнет такая же проблема в будущем, это было довольно легко исправить. Я использовал clearView (RecyclerView RecyclerView, RecyclerView.ViewHolder ViewHolder) для обработки, когда все перетаскивание было завершено, и забыл вызвать его супер-метод. Вот почему он не обновлялся должным образом.
Оригинальный вопрос:
Вот весь код: https://github.com/vustav/Ppaaiinntt/tree/master/app/src/main/java/com/decent/rvtest
Все работает нормально, за исключением случаев, когда я добавляю элемент сразу после удаления другого. Однако он существует. Если я добавлю еще один, между старым списком и новым элементом останется пространство правильного размера. Я использую строку, в которой они добавляют свои имена перед печатью, и она отображается там, и если я перетаскиваю, чтобы изменить положение элементов, она отображается правильно.
Моя репутация не позволяет мне публиковать изображения, поэтому для imgur-альбома потребуется: http://imgur.com/a/bmb17
-
На первом изображении есть три элемента, а строка напечатана внизу.
-
Второе изображение после салфетки. Обратите внимание, что строка обновляется.
-
Третий — после добавления еще одного «111». Строка верна, но она не отображается в представлении.
-
Четвертый — после добавления другого. Строка по-прежнему верна, и новый элемент отображается в представлении.
-
Последнее изображение отображается после перетаскивания, чтобы изменить положение последних двух элементов. Теперь все снова в порядке.
Это соответствующие методы (я думаю):
protected void add(PictureElement pe){
chain.add(pe);
notifyItemInserted(chain.size()-1);
}
public void remove(int position) {
chain.remove(position);
notifyItemRemoved(position);
}
protected void swap(int from, int to){
chain.swap(from, to);
notifyItemMoved(from, to);
}
Редактировать: onBindViewHolder, getItemCount и ViewHolder:
@Override
public int getItemCount() {
return chain.size();
}
@Override
public void onBindViewHolder(PEViewHolder PEViewHolder, int i) {
PictureElement pe = chain.get(i);
PEViewHolder.name.setText(pe.getName());
}
protected static class PEViewHolder extends RecyclerView.ViewHolder {
protected TextView name;
public PEViewHolder(View v) {
super(v);
name = (TextView) v.findViewById(R.id.txtName);
}
}
Комментарии:
1. опубликуйте свой код адаптера, в частности метод привязки и getCount
Ответ №1:
Интересная цитата о различных методах уведомления, которые вы используете
public final void notifyItemRemoved (int position) Уведомляет всех зарегистрированных наблюдателей о том, что элемент, ранее расположенный в позиции, был удален из набора данных. Элементы, ранее расположенные в позиции и после нее, теперь могут быть найдены в oldPosition — 1. Это событие структурных изменений. Представления других существующих элементов в наборе данных по-прежнему считаются актуальными и не будут восстановлены, хотя их позиции могут быть изменены. Положение параметров: положение элемента, который теперь удален.
public final void notifyItemRangeChanged (int positionStart, int ItemCount)Уведомите всех зарегистрированных наблюдателей о том, что элементы ItemCount, начинающиеся с позиции positionStart, изменились. Эквивалентно вызову notifyItemRangeChanged(position, ItemCount, null);. Это событие изменения элемента, а не событие структурных изменений. Это указывает на то, что любое отражение данных в заданном диапазоне позиций устарело и должно быть обновлено. Элементы в заданном диапазоне сохраняют тот же идентификатор.
Не могли бы вы попробовать прокомментировать этот блок кода и проверить, работает ли он
//Called by the ItemTouchHelper when the user interaction with an element is over and it also
// completed its animation
/*
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//update from where the action took place
mPEAdapter.updateChain(viewHolder.getLayoutPosition());
//clearView is called after onMove so any drags or swipes are complete
dragging = false;
mPEAdapter.setSwipe(false);
}
*/
Комментарии:
1. @GrandDuc очень плохо .. без вашего полного кода невозможно выполнить отладку. Вы случайно не используете пользовательский LayoutManager?
2. Спасибо за попытку помочь! Добавлена ссылка на код в исходном вопросе.
3. @GrandDuc попробуйте обновленный ответ, это довольно просто, просто прокомментируйте этот блок кода, переопределение clearView () внутри «PETouchHelper»
4. Он работает без clearView ()! Но это вызывает другую проблему. Мне нужно, чтобы цепочка обновлялась с начала перетаскивания, 3-7 должен обновляться с 3 и так далее. onMove() обновляется при каждом обмене, поэтому 3-4, 4-5, 5-6 и 6-7. Знаете ли вы, как я могу зарегистрировать, где начинается перетаскивание, и обновлять только после его завершения?
5. Под обновлением я подразумеваю обновление списка объектов (строк прямо сейчас, но его не будет в конечном приложении), а не анимации подкачки.