У меня есть RecyclerView с текстовым полем TextView и кросс-кнопка ImageView. У меня есть кнопка за пределами окна просмотра, которая делает видимую / исчезнувшую перекрестную кнопку ImageView.
Я ищу, чтобы удалить элемент из recylerview, когда эти элементы крест кнопка ImageView нажата.
Мой адаптер:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener {
private ArrayList<String> mDataset;
private static Context sContext;
public MyAdapter(Context context, ArrayList<String> myDataset) {
mDataset = myDataset;
sContext = context;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false);
ViewHolder holder = new ViewHolder(v);
holder.mNameTextView.setOnClickListener(MyAdapter.this);
holder.mNameTextView.setOnLongClickListener(MyAdapter.this);
holder.mNameTextView.setTag(holder);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mNameTextView.setText(mDataset.get(position));
}
@Override
public int getItemCount() {
return mDataset.size();
}
@Override
public void onClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (view.getId() == holder.mNameTextView.getId()) {
Toast.makeText(sContext, holder.mNameTextView.getText(), Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onLongClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (view.getId() == holder.mNameTextView.getId()) {
mDataset.remove(holder.getPosition());
notifyDataSetChanged();
Toast.makeText(sContext, "Item " + holder.mNameTextView.getText() + " has been removed from list",
Toast.LENGTH_SHORT).show();
}
return false;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mNumberRowTextView;
public TextView mNameTextView;
public ViewHolder(View v) {
super(v);
mNameTextView = (TextView) v.findViewById(R.id.nameTextView);
}
}
}
Мой макет:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:id="@+id/layout">
<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:padding="5dp"
android:background="@drawable/greyline"/>
<ImageView
android:id="@+id/crossButton"
android:layout_width="16dp"
android:layout_height="16dp"
android:visibility="gone"
android:layout_marginLeft="50dp"
android:src="@drawable/cross" />
</LinearLayout>
Как я могу получить что-то вроде onClick, работающее для моего CrossButton ImageView? Есть ли способ лучше? Может быть, изменив весь элемент на клик, чтобы удалить элемент? В окне повторного просмотра отображается список мест, которые необходимо отредактировать. Любые технические советы или комментарии / предложения по наилучшей реализации будут высоко оценены.
java
android
user-interface
android-recyclerview
selection
Twentyonehundred
источник
источник
Ответы:
Я сделал что-то подобное. В вашем
MyAdapter
:Надеюсь это поможет.
Редактировать:
getPosition()
устарела, используйтеgetAdapterPosition()
вместо этого.источник
notifyItemRangeChanged(getPosition, mDataSet.size());
ответ Парадита после удаления предмета, чтобы все представления под удаленным предметом были соответственно скорректированы.getPosition()
теперь она устарелаnotifyItemRemoved(position)
было недостаточно.Прежде всего, элемент должен быть удален из списка!
затем:
источник
если этот предмет не удален, используйте этот магический метод :)
Котлин версия
источник
проблема
RecyclerView
по умолчанию не знает изменений вашего набора данных. Это означает, что всякий раз, когда вы делаете удаление / добавление в свой список данных, эти изменения не будут отражены непосредственно в вашем RecyclerView.Решение
RecyclerView предлагает вам несколько способов поделиться своим состоянием набора данных. Это происходит потому, что изменение вашего набора данных не подразумевает изменения представления, и наоборот. Стандартные API-интерфейсы Android позволяют связать процесс удаления данных (для целей вопроса) с процессом удаления представлений.
Лучший подход
Если вы не укажете правильно, что происходит при добавлении / удалении элементов (речь идет о представлениях), дети RecyclerView анимируются без ответа из-за отсутствия информации о том, как перемещать различные представления по списку.
Вместо этого следующий код будет точно воспроизводить анимацию только на
IndexOutOfBoundException
удаленном дочернем элементе (и, как примечание, для меня он исправил любые s, помеченные стековой трассировкой как «несогласованность данных»)Если заглянуть внутрь,
RecyclerView
мы можем найти документацию, объясняющую, что вторым параметром, который мы должны передать, является количество элементов, которые удаляются из набора данных, а не общее количество элементов (как неправильно указано в некоторых других источниках информации).источник
Возможно двойной ответ, но довольно полезный для меня. Вы можете реализовать метод, приведенный ниже,
RecyclerView.Adapter<RecyclerView.ViewHolder>
и можете использовать этот метод в соответствии с вашими требованиями, я надеюсь, что он будет работать для васисточник
Вот несколько наглядных дополнительных примеров. Смотрите мой полный ответ для примеров добавления и удаления диапазона.
Добавить один элемент
Добавить "Свинья" в указателе
2
.Удалить один элемент
Удалить «Свинью» из списка.
источник
Я перепробовал все вышеперечисленные ответы, но вставка или удаление элементов в режиме повторного просмотра вызывает проблемы с положением в наборе данных. Закончилось использование
delete(getAdapterPosition());
внутри viewHolder, который отлично работал при поиске позиции предметов.источник
Проблема, с которой я столкнулся, заключалась в том, что я удалял из списка элемент, который больше не был связан с адаптером, чтобы убедиться, что вы модифицируете правильный адаптер, для которого вы можете реализовать такой метод в своем адаптере:
И назовите это в своем фрагменте или деятельности так:
источник
Я надеюсь, что это поможет вам.
источник
если вы хотите удалить элемент, вы должны сделать это: сначала удалить элемент:
на следующем шаге вы должны уведомить адаптер утилизатора о том, что вы удаляете элемент с помощью этого кода:
но если вы измените элемент, сделайте так: сначала измените параметр вашего объекта следующим образом:
или новый это так:
затем сообщите адаптеру утилизатора, что вы модифицируете элемент с помощью этого кода:
надежда помогает тебе
источник
источник
notifyItemRemoved(position)
.К методу
onBindViewHolder
написать этот кодисточник
Incase Любой, кто хочет реализовать нечто подобное в классе Main вместо класса Adapter, вы можете использовать:
где friendsListRecycler - это имя адаптера
источник
источник
сделать интерфейс в пользовательский класс адаптера и обработать событие click в представлении переработчика.
после определения адаптера и привязки к представлению переработчика, называемому ниже кода.
источник
Если вам интересно, как я, где мы можем получить положение адаптера в методе getadapterposition (); его в viewholder object.so вы должны поместить свой код следующим образом
источник
источник