¿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?


¡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.


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.