Come leggere i dati dal database Firebase e visualizzare più campi in ListView con ArrayAdapter
Ho passato la metà migliore della giornata cercando di capire come leggere i dati dal mio database Firebase e visualizzare più campi in ListViewun file ArrayAdapter. Dopo aver finalmente ottenuto il mio ListView per visualizzare un pezzo di dati in una visualizzazione di testo, sono bloccato cercando di visualizzare altri due campi.
Nella mia MainActivityclasse ho usato android.R.layout.simple_list_item_1nel costruttore dell'adattatore perché mi è stato detto che l'argomento textViewResourceID deve contenere solo un TextView. Quindi, per ribadire il mio problema: non riesco a capire come visualizzare più campi con un adattatore di array. Questa app attualmente mostra solo il campo marca . Grazie mille in anticipo, ho iniziato lo sviluppo di Android solo una settimana fa! Ecco il mio codice qui sotto:
SearchModel.java
public class SearchModel {
public String make;
private String model;
private String stock;
public SearchModel() {}
public String getMake() {
return this.make;
}
public void setMake(String make) {
this.make = make;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getStock() {
return stock;
}
public void setStock(String stock) {
this.stock = stock;
}
}
MainActivity.java
(Ho omesso la sezione inferiore irrilevante della classe dopo onCreate())
public class MainActivity extends AppCompatActivity {
private DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("users").child("user1");
private ListView mListView;
private TextView tv_make;
private TextView tv_model;
private TextView tv_stock;
private ArrayList<String> list = new ArrayList<>();
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
tv_make = (TextView) findViewById(R.id.tv_list_item_make);
tv_model = (TextView) findViewById(R.id.tv_list_item_model);
tv_stock = (TextView) findViewById(R.id.tv_list_item_stock);
databaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
String value = snapshot.child("make").getValue(String.class);
list.add(value);
mListView = (ListView) findViewById(R.id.lv_searches);
adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, list);
mListView.setAdapter(adapter);
}
@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
}
Ecco il ListViewin content.main.xml:
<ListView
android:id="@+id/lv_searches"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
Ed ecco il list_item.xmlche dovrebbe sedersi nel mio ListView. Qui è dove vorrei visualizzare i tre valori String (marca, modello, stock) in un'istanza di SearchModel.java.
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:padding="10dp">
<TextView
android:id="@+id/tv_list_item_make"
android:layout_width="wrap_content"
android:layout_height="50dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_list_item_model"
android:layout_width="wrap_content"
android:layout_height="40dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<TextView
android:id="@+id/tv_list_item_stock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Questo è il layout del mio database Firebase:
Risposte
dopo due giorni di blocco sono stato in grado di rispondere alla mia stessa domanda! Si spera che questo aiuterà i futuri principianti a rimanere bloccati nel tentativo di visualizzare una visualizzazione personalizzata all'interno di un ArrayAdapter. Fondamentalmente, ho creato una ArrayAdapterclasse personalizzata che poteva contenere tre TextViewsal suo interno.
Non sono affatto un esperto e non sarò in grado di spiegare questo come altri, quindi incollerò invece un link ai due video tutorial che ho seguito e con cui ho avuto successo.
Tutorial per principianti Android n. 8 - Adattatore ListView personalizzato per la visualizzazione di più colonne https://www.youtube.com/watch?v=E6vE8fqQPTE&t=392s
Tutorial per principianti Android n. 9 - Adattatore ListView personalizzato [con animazione di caricamento] https://www.youtube.com/watch?v=SApBLHIpH8A
Ecco il mio codice aggiornato di seguito:
CustomAdapter.java
public class CustomAdapter extends BaseAdapter {
private static ArrayList<SearchModel> searchArrayList;
private LayoutInflater mInflater;
private Context mContext;
private int lastPosition;
/**
* Holds elements in a view
*/
static class ViewHolder {
TextView make;
TextView model;
TextView stock;
}
public CustomAdapter(Context context, ArrayList<SearchModel> results) {
searchArrayList = results;
mContext = context;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return searchArrayList.size();
}
@Override
public Object getItem(int position) {
return searchArrayList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String make = searchArrayList.get(position).getMake();
String model = searchArrayList.get(position).getModel();
String stock = searchArrayList.get(position).getStock();
final View result;
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.make = (TextView) convertView.findViewById(R.id.tv_list_item_make);
holder.model = (TextView) convertView.findViewById(R.id.tv_list_item_model);
holder.stock = (TextView) convertView.findViewById(R.id.tv_list_item_stock);
result = convertView;
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
result = convertView;
}
Animation animation = AnimationUtils.loadAnimation(mContext,
(position > lastPosition) ? R.anim.load_down_anim : R.anim.load_up_anim);
result.startAnimation(animation);
lastPosition = position;
holder.make.setText(make);
holder.model.setText(model);
holder.stock.setText(stock);
return convertView;
}
}
MainActivity.java(Solo il onCreatemetodo)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
databaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
String make = snapshot.child("make").getValue(String.class);
String model = snapshot.child("model").getValue(String.class);
String stock = snapshot.child("stock").getValue(Long.class).toString();
SearchModel searchModel = new SearchModel(make, model, stock);
searchList.add(searchModel);
CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), searchList);
mListView = (ListView) findViewById(R.id.lv_searches);
mListView.setAdapter(customAdapter);
}
@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});