es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

FirebaseRecyclerAdapter con AsyncTask

Estoy creando mi aplicación y necesito llenar el recyclerview y luego desplazarme hacia el elemento deseado. Para hacer esto, utilicé AsyncTask, pero el problema es que scrollToPosition() no funciona. Tal vez alguien pueda decirme qué estoy haciendo mal, ya que es la primera vez que trabajo con AsyncTask y no entiendo cuál es mi error.

public class SomeUserProfileFragment extends Fragment {

private void loadUserPosts() {
mDatabaseReference = FirebaseDatabase.getInstance().getReference().child(“Posts”);

new SetFirebaseRecyclerAdapter().execute();
}

class SetFirebaseRecyclerAdapter extends AsyncTask<integer, void,=”” void=””>{
@Override
protected Void doInBackground(Integer… integers) {
FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder()
.setQuery(mDatabaseReference.orderByChild(“uid”).equalTo(uid), TestPosts.class)
.build();

mLinearLayoutManager = new LinearLayoutManager(mContext);
mLinearLayoutManager.setReverseLayout(true);
mLinearLayoutManager.setStackFromEnd(true);
adapter = new TestPostsAdapter(options, mContext);

return null;
}

@Override
protected void onPostExecute(Void aVoid) {
mRecyclerView.setLayoutManager(mLinearLayoutManager);
mRecyclerView.setAdapter(adapter);
mRecyclerView.scrollToPosition(1);
adapter.startListening();
}
}
}</integer,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el uso del método scrollToPosition() en el método onPostExecute(). Este método se ejecuta en el hilo principal de la interfaz de usuario después de que el método doInBackground() complete su ejecución, por lo que debería ser seguro usar el método scrollToPosition() dentro de él.

    Sin embargo, es posible que el RecyclerView aún no haya terminado de renderizar sus elementos en el momento en que se llama al método scrollToPosition(), lo que podría ser la razón por la que no funciona. Una solución es esperar a que el RecyclerView termine de renderizar agregando un listener y luego llamando al método scrollToPosition() dentro de él.

    Aquí hay una versión actualizada del código con el listener agregado:

    public class SomeUserProfileFragment extends Fragment {
    
        private void loadUserPosts() {
            mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Posts");
    
            new SetFirebaseRecyclerAdapter().execute();
        }
    
        class SetFirebaseRecyclerAdapter extends AsyncTask<integer, void,="" void=""> {
            @Override
            protected Void doInBackground(Integer... integers) {
                FirebaseRecyclerOptions<testposts> options = new FirebaseRecyclerOptions.Builder<testposts>()
                        .setQuery(mDatabaseReference.orderByChild("uid").equalTo(uid), TestPosts.class)
                        .build();
    
                mLinearLayoutManager = new LinearLayoutManager(mContext);
                mLinearLayoutManager.setReverseLayout(true);
                mLinearLayoutManager.setStackFromEnd(true);
                adapter = new TestPostsAdapter(options, mContext);
    
                return null;
            }
    
            @Override
            protected void onPostExecute(Void aVoid) {
                mRecyclerView.setLayoutManager(mLinearLayoutManager);
                mRecyclerView.setAdapter(adapter);
                adapter.startListening();
    
                mRecyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
                    @Override
                    public void onLayoutChange(View v, int left, int top, int right, int bottom,
                                               int oldLeft, int oldTop, int oldRight, int oldBottom) {
                        mRecyclerView.removeOnLayoutChangeListener(this);
                        mRecyclerView.scrollToPosition(1);
                    }
                });
            }
        }
    }
    

    Con este código actualizado, el listener espera a que el RecyclerView termine de renderizar y luego llama a scrollToPosition() dentro de él.</integer,>

Comments are closed.