Adicionar um novo item para visualizar a reciclagem programaticamente?

115

Ainda estou tentando entender a visão da reciclagem. Eu tenho um arraylist, que uso para inicializar uma visualização do reciclador.

Como posso adicionar novos itens ao post de visualização do reciclador configurando um adaptador e gerenciador de layout?

private void initData() {
        mItems = new ArrayList<String>();
        for (int i = 0; i < ITEMS_COUNT; i++) {
            mItems.add("Item " + (i + 1));
        }
    }

    private void initRecyclerView() {
        mRecentRecyclerView = (RecyclerView) findViewById(R.id.recentrecyclerView);
        mRecentRecyclerView.setHasFixedSize(true);
        mRecentLayoutManager = new LinearLayoutManager(this);
        mRecentRecyclerView.setLayoutManager(mRecentLayoutManager);



        mAdapter = new RecyclerView.Adapter<CustomViewHolder>() {
            @Override
            public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.notice_snippet
                        , viewGroup, false);
                return new CustomViewHolder(view);
            }

            @Override
            public void onBindViewHolder(CustomViewHolder viewHolder, int i) {
                viewHolder.noticeSubject.setText(mItems.get(i));
            }

            @Override
            public int getItemCount() {
                return mItems.size();
            }

        };
        mRecentRecyclerView.setAdapter(mAdapter);

    private class CustomViewHolder extends RecyclerView.ViewHolder {

        private TextView noticeSubject;

        public CustomViewHolder(View itemView) {
            super(itemView);

            noticeSubject = (TextView) itemView.findViewById(R.id.notice_subject);
        }
    }

Então, basicamente, depois de I initdata()e initRecyclerView(), como adiciono um novo item ao RecyclerView ??

Shubham Kanodia
fonte
Você pode ver este exemplo no código do Github Happy !!!
Cabezas de

Respostas:

272

Primeiro adicione seu item mItemse, em seguida, use:

mAdapter.notifyItemInserted(mItems.size() - 1);

este método é melhor do que usar:

mAdapter.notifyDataSetChanged();

no desempenho.

Mostafa
fonte
11
Boa resposta. Isso também significa que não vai quebrar as animações
Ben Pearson
7
Esta deve ser aceita como resposta certa, a outra quebra animações e é menos eficiente que esta.
Massimo
27
Fui eu quem respondeu a resposta aceita e acho que esta deveria ser a aceita: D
Abdelrahman Elkady
2
@AJW sim. o índice do último elemento de mItems é mItems.size () - 1.
Mostafa de
2
Obrigado! Tenho imagens que devem ser carregadas da internet no onBindViewHolder. Sempre que recebo dados, preciso anexar à lista e chamar notificarDataSetChanged (). Mas isso fez com que a imagem tremesse. Acima estava a solução certa que eu estava procurando. Você também pode usar mAdapter.notifyItemRangeInserted (mItems.size () - 1, new_array_of_items_to_be_added.size ());
Vignesh Bala de
38

basta adicionar à sua estrutura de dados (mItems) e, em seguida, notificar seu adaptador sobre a alteração do conjunto de dados

private void addItem(String item) {
  mItems.add(item);
  mAdapter.notifyDataSetChanged();
}

addItem("New Item");
Abdelrahman Elkady
fonte
2
E se não for uma string que quero adicionar, mas um ViewGroup?
IgorGanapolsky
1
@IgorGanapolsky Também tenho a mesma dúvida. Você encontrou alguma solução para isso?
Sash_KP
mesma dúvida aqui também! qualquer ajuda?
Srujan Barai
5
@IgorGanapolsky O tipo de item seria especificado por seu adaptador, portanto, poderia ser qualquer objeto. Mas tenha em mente que o item que você adicionou deve ser apenas os dados. O RecyclerView incorporou funções para aumentar e vincular uma visualização, que é o que acontecerá quando você notificarDataSetChanged (). Você pode depurar o onBindViewHolder para ver a visualização sendo editada.
Chris
1
@IgorGanapolsky Você ArrayList<T>teria que usar o tipo de objeto que deseja adicionar, por exemplo, em ArrayList<ViewGroup>vez de ArrayList<String>. Em seguida, você pode apenas alterar o tipo de argumento de Stringpara ViewGroup. (Desculpem o necro).
Eric Reed
14

se você estiver adicionando vários itens à lista, use isto:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

Isso notifica qualquer observador registrado de que os itens itemCount refletidos no momento, começando em positionStart, foram inseridos recentemente. O item anteriormente localizado em positionStart e além agora pode ser encontrado começando na posição positinStart + itemCount

item existente no conjunto de dados ainda considerado atualizado.

Nitin Anand
fonte