TransWikia.com

Como fazer busca dentro de uma RecycleView?

Stack Overflow em Português Asked by FranciscoM on December 2, 2021

Tenho uma RecycleView que recebe dados do Firebase, cada dado cria uma box no layout com as informações contidas dentro de cada key lá do Firebase.
Quero que busque um determinado box de dado nesta lista e me mostre na tela.
Por exemplo, em um layout com vários botões, ao ser clicado o 1º botão quero que abra a RecycleView e carregue para mim um determinado box de dado que está dentro desta lista. Preciso saber se é possível fazer isso com o RecycleView, caso negativo como poderia estar implementado esse modelo.

public class ShowImagesActivity extends AppCompatActivity {
    private RecyclerView recyclerView;

    private RecyclerView.Adapter adapter;

    private DatabaseReference mDatabase;

    private ProgressDialog progressDialog;

    private List<Upload> uploads;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_images);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        progressDialog = new ProgressDialog(this);

        uploads = new ArrayList<>();

        progressDialog.setMessage("Aguardando...");
        progressDialog.show();
        mDatabase = FirebaseDatabase.getInstance().getReference(Constants.DATABASE_PATH_UPLOADS);

        mDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {

                progressDialog.dismiss();

                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    Upload upload = postSnapshot.getValue(Upload.class);
                    uploads.add(upload);
                }

                adapter = new MyAdapter(getApplicationContext(), uploads);

                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                progressDialog.dismiss();
            }
        });

    }
}

classe Upload

public class Upload{

        public String name;
        public String descricao;
        public String local;
        public String url;

    public Upload() {
    }

    public Upload(String name, String descricao,String local,String url) {
        this.name = name;
        this.descricao = descricao;
        this.local = local;
        this.url= url;
    }

    public String getName() {
        return name;
    }
    public String getDescricao() {
        return descricao;
    }
    public String getLocal() {
        return local;
    }
    public String getUrl() {
        return url;
    }
}

classe ShowMap:

public class ShowMap extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    LocationManager locationManager;
    public RecyclerView recyclerView;
    public List<Upload> uploads;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map_activity);
        FirebaseApp.initializeApp(this);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    }
    public int findInUploadsArray(List<Upload> uploads, String name){
        for(int i = 0; i < uploads.size(); i++){
            // supondo que sua classe possui um atributo "nome" e você está procurando um nome específico
            if(uploads.get(i).getName().equals(name)) return i;
        }

        return -1;
    }



    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        uploads = new ArrayList<>();
        recyclerView = new RecyclerView(getApplicationContext());

        DatabaseReference ref = FirebaseDatabase.getInstance().getReference();



        ref.child("uploads").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                Iterator<DataSnapshot> dataSnapshotsChat =  dataSnapshot.getChildren().iterator();

                while (dataSnapshotsChat.hasNext()) {
                    DataSnapshot dataSnapshotChild = dataSnapshotsChat.next();
                    String latitudeL = dataSnapshotChild.child("latitude").getValue().toString();
                    String longitudeL = dataSnapshotChild.child("longitude").getValue().toString();
                    double latitude1 = Double.parseDouble((latitudeL));
                    double longitude1 = Double.parseDouble(longitudeL);
                    LatLng local = new LatLng(latitude1, longitude1);
                    final String title = dataSnapshotChild.child("name").getValue().toString();


                    mMap.addMarker(new MarkerOptions().position(local).title(title));
                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(local, 10));
                    Log.v("log",""+local);
                    Log.v("log",""+title);


                    mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                        @Override
                        public boolean onMarkerClick(Marker marker) {

                            int position = findInUploadsArray(uploads,marker.getTitle());
                            Log.v("log",""+marker.getTitle());

                            recyclerView.scrollToPosition(position);
                            return true;
                        }
                    });
                }}

            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException();
            }
        });

    }

}

One Answer

Como você guarda os dados num ArrayList<Upload>, crie um método que encontre o que você quer nesse Array (pode ser um loop com um if interno) e retorne a posição do mesmo.

Ex:

public int findInUploadsArray(List<Upload> uploads, String nome){
  for(int i = 0; i < uploads.size(); i++){
    // supondo que você está procurando um box por um nome específico
    if(uploads.get(i).getName().equals(nome)) return i;
  }

  return -1;
}

Depois você pode mover a RecyclerView para esta posição:

Ex:

// Coloque esse código no clickListener dos botões. 
// A variável dadoProcurado fica por sua conta preencher de acordo com o botão clicado
int position = findInUploadsArray(uploads, dadoProcurado);   
recyclerView.scrollToPosition(position);

Answered by Márcio Oliveira on December 2, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP