¿Agregar un nuevo elemento a recyclingview mediante programación?

114

Todavía estoy tratando de entender la vista del reciclaje. Tengo una lista de matrices, que uso para inicializar una vista de reciclador con.

¿Cómo puedo agregar nuevos elementos a la publicación de la vista del reciclador configurando un adaptador y un administrador de diseño?

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);
        }
    }

Entonces, básicamente, después de que yo initdata()y initRecyclerView(), ¿cómo agrego un nuevo elemento al RecyclerView?

Shubham Kanodia
fuente
¡Puedes ver este ejemplo en el código Github Happy!
Cabezas

Respuestas:

272

Primero agregue su artículo mItemsy luego use:

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

este método es mejor que usar:

mAdapter.notifyDataSetChanged();

en el rendimiento.

Mostafa
fuente
11
Buena respuesta. También significa que no romperá las animaciones
Ben Pearson
7
Esta debe aceptarse como respuesta correcta, la otra rompe las animaciones y es menos eficiente que esta.
Massimo
27
Yo soy el que respondió la respuesta aceptada y creo que esta debería ser la aceptada: D
Abdelrahman Elkady
2
@AJW sí. El índice del último elemento de mItems es mItems.size () - 1.
Mostafa
2
¡Gracias! Tengo imágenes que deberían cargarse desde Internet en onBindViewHolder. Cada vez que recibo datos, necesito agregarlos a la lista y llamar notificarDataSetChanged (). Pero esto produjo un efecto de parpadeo de la imagen. Arriba estaba la solución correcta que estaba buscando. También puede utilizar mAdapter.notifyItemRangeInserted (mItems.size () - 1, new_array_of_items_to_be_added.size ());
Vignesh Bala
38

simplemente agregue a su estructura de datos (mItems) y luego notifique a su adaptador sobre el cambio del conjunto de datos

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

addItem("New Item");
Abdelrahman Elkady
fuente
2
¿Qué pasa si no es una cadena que quiero agregar, sino un ViewGroup?
IgorGanapolsky
1
@IgorGanapolsky también tengo la misma duda. ¿Encontraste alguna solución para eso?
Sash_KP
¡La misma duda aquí también! ¿alguna ayuda?
Srujan Barai
5
@IgorGanapolsky El tipo de elemento lo especificaría su Adaptador, por lo que podría ser realmente cualquier objeto. Pero tenga en cuenta que el elemento que está agregando se supone que son los datos. El RecyclerView tiene funciones integradas para inflar y vincular una vista, que es lo que sucederá cuando notifiqueDataSetChanged (). Puede depurar onBindViewHolder para ver la vista que se está editando.
Chris
1
@IgorGanapolsky Debería ArrayList<T>usar el tipo de objeto que desea agregar, por ejemplo, en ArrayList<ViewGroup>lugar de ArrayList<String>. Entonces puede simplemente cambiar el tipo de argumento de Stringa ViewGroup. (Perdón por necro).
Eric Reed
14

si está agregando varios elementos a la lista, use esto:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

Esto notifica a los observadores registrados que los elementos itemCount reflejados actualmente que comienzan en positionStart se han insertado nuevamente. El elemento anteriormente ubicado en positionStart y más allá ahora se puede encontrar comenzando en la posición positinStart + itemCount

elemento existente en el conjunto de datos aún se considera actualizado.

Nitin Anand
fuente