Eu tenho um RecyclerView com uma caixa de texto TextView e um botão cruzado ImageView. Eu tenho um botão fora da visão de reciclagem que torna o botão cruzado ImageView visível / desapareceu.
Estou procurando remover um item da recylerview, quando esse item cruza o botão ImageView é pressionado.
Meu adaptador:
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);
}
}
}
Meu layout é:
<?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>
Como posso obter algo como um onClick trabalhando no meu crossButton ImageView? Existe uma maneira melhor? Talvez mudar o item inteiro ao clicar em remover o item? A visão de reciclagem mostra uma lista de locais que precisam ser editados. Qualquer conselho técnico ou comentários / sugestões sobre a melhor implementação seriam muito apreciados.
java
android
user-interface
android-recyclerview
selection
Twentyonehundred
fonte
fonte
Respostas:
Eu fiz algo semelhante. Na tua
MyAdapter
:Espero que isto ajude.
Editar:
getPosition()
está obsoleto agora, use em seugetAdapterPosition()
lugar.fonte
notifyItemRangeChanged(getPosition, mDataSet.size());
à resposta do paradita depois de remover o item, para que todas as visualizações abaixo do item removido se ajustem adequadamente.getPosition()
agora está obsoletonotifyItemRemoved(position)
não foi suficiente.Antes de tudo, o item deve ser removido da lista!
então:
fonte
se o item ainda não for removido, use este método mágico :)
Versão Kotlin
fonte
Problema
RecyclerView
é, por padrão, inconsciente das alterações no seu conjunto de dados. Isso significa que sempre que você excluir ou adicionar sua lista de dados, essas alterações não serão refletidas diretamente no seu RecyclerView.Solução
O RecyclerView oferece alguns métodos para compartilhar seu estado do conjunto de dados. Isso acontece porque uma modificação no seu conjunto de dados não implica uma alteração na exibição e vice-versa. As APIs padrão do Android permitem vincular o processo de remoção de dados (para os fins da pergunta) ao processo de remoção de visualizações.
Melhor Abordagem
Se você não especificar corretamente o que acontece com a adição / remoção de itens (falando sobre visualizações), os filhos do RecyclerView são animados sem resposta devido à falta de informações sobre como mover as diferentes visualizações pela lista.
Em vez disso, o código a seguir reproduz com precisão a animação, apenas no filho que está sendo removido (e, como observação adicional, para mim ele corrigiu qualquer
IndexOutOfBoundException
s, marcado pelo stacktrace como "inconsistência de dados")Sob o capô, se examinarmos
RecyclerView
, podemos encontrar documentação explicando que o segundo parâmetro que precisamos passar é o número de itens que são removidos do conjunto de dados, não o número total de itens (conforme afirmado incorretamente em outras fontes de informação).fonte
Possivelmente uma resposta duplicada, mas bastante útil para mim. Você pode implementar o método fornecido abaixo
RecyclerView.Adapter<RecyclerView.ViewHolder>
e usar esse método de acordo com seus requisitos. Espero que funcione para vocêfonte
Aqui estão alguns exemplos visuais suplementares. Veja minha resposta completa para exemplos de adição e remoção de um intervalo.
Adicionar item único
Adicione "Pig" no índice
2
.Remover item único
Remova "Pig" da lista.
fonte
Eu tentei todas as respostas acima, mas a inserção ou remoção de itens na reciclagem causa problemas com a posição no dataSet. Acabou usando
delete(getAdapterPosition());
dentro do viewHolder, que funcionou muito bem para encontrar a posição dos itens.fonte
O problema que tive foi remover um item da lista que não estava mais associado ao adaptador para garantir que você esteja modificando o adaptador correto. Você pode implementar um método como este no seu adaptador:
E chame-o em seu fragmento ou atividade como esta:
fonte
Espero que isso lhe ajude.
fonte
se você deseja remover o item, faça o seguinte: primeiro remova o item:
na próxima etapa, você deve notificar seu adaptador de reciclagem que remove um item por este código:
mas se você alterar um item, faça o seguinte: primeiro altere um parâmetro do seu objeto como este:
ou novo assim:
em seguida, notifique seu adaptador de reciclagem que você modifica um item por este código:
a esperança ajuda você.
fonte
fonte
notifyItemRemoved(position)
.To Method
onBindViewHolder
Escreva este códigofonte
Caso alguém queira implementar algo parecido com isso na classe Main, em vez da classe Adapter, você pode usar:
em que friendsListRecycler é o nome do adaptador
fonte
fonte
faça interface na classe do adaptador personalizado e manipule o evento click na visualização do reciclador.
depois de definir o adaptador e vincular à visualização do reciclador chamada abaixo do código ..
fonte
Caso você esteja se perguntando, como eu fiz, onde podemos obter a posição do adaptador no método getadapterposition (); é no viewholder object.so você tem que colocar seu código assim
fonte
fonte