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();
}
});
}
}
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP