Android
Visualizzazione elenco
Ricerca…
introduzione
ListView è un gruppo di visualizzazione che raggruppa diversi elementi da un'origine dati come una matrice o un database e li visualizza in un elenco a scorrimento. I dati sono associati con listview utilizzando una classe Adapter.
Osservazioni
ListView
è un gruppo di viste che visualizza un elenco di elementi scorrevoli.
Gli elementi dell'elenco vengono automaticamente inseriti nell'elenco utilizzando un Adapter
che estrae il contenuto da un'origine come una query dell'array o del database e converte ciascun risultato di un elemento in una vista inserita nell'elenco.
Quando il contenuto del layout è dinamico o non predeterminato, è possibile utilizzare un layout che sottoclassi AdapterView
per popolare il layout con le visualizzazioni in fase di esecuzione. Una sottoclasse della classe AdapterView
utilizza un Adapter
per associare i dati al relativo layout.
Prima di utilizzare ListView
è necessario controllare anche gli esempi di RecyclerView
.
Filtro con CursorAdapter
// Get the reference to your ListView
ListView listResults = (ListView) findViewById(R.id.listResults);
// Set its adapter
listResults.setAdapter(adapter);
// Enable filtering in ListView
listResults.setTextFilterEnabled(true);
// Prepare your adapter for filtering
adapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
// in real life, do something more secure than concatenation
// but it will depend on your schema
// This is the query that will run on filtering
String query = "SELECT _ID as _id, name FROM MYTABLE "
+ "where name like '%" + constraint + "%' "
+ "ORDER BY NAME ASC";
return db.rawQuery(query, null);
}
});
Diciamo che la tua query verrà eseguita ogni volta che l'utente digita un EditText
:
EditText queryText = (EditText) findViewById(R.id.textQuery);
queryText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
// This is the filter in action
adapter.getFilter().filter(s.toString());
// Don't forget to notify the adapter
adapter.notifyDataSetChanged();
}
@Override
public void afterTextChanged(final Editable s) {
}
});
Custom ArrayAdapter
Per impostazione predefinita, la classe ArrayAdapter crea una vista per ogni elemento dell'array chiamando toString()
su ciascun elemento e posizionando il contenuto in un TextView.
Per creare una vista complessa per ciascun elemento (ad esempio, se si desidera un ImageView per ciascun elemento dell'array), estendere la classe ArrayAdapter e sovrascrivere il metodo getView()
per restituire il tipo di visualizzazione desiderato per ciascun elemento.
Per esempio:
public class MyAdapter extends ArrayAdapter<YourClassData>{
private LayoutInflater inflater;
public MyAdapter (Context context, List<YourClassData> data){
super(context, 0, data);
inflater = LayoutInflater.from(context);
}
@Override
public long getItemId(int position)
{
//It is just an example
YourClassData data = (YourClassData) getItem(position);
return data.ID;
}
@Override
public View getView(int position, View view, ViewGroup parent)
{
ViewHolder viewHolder;
if (view == null) {
view = inflater.inflate(R.layout.custom_row_layout_design, null);
// Do some initialization
//Retrieve the view on the item layout and set the value.
viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) view.getTag();
}
//Retrieve your object
YourClassData data = (YourClassData) getItem(position);
viewHolder.txt.setTypeface(m_Font);
viewHolder.txt.setText(data.text);
viewHolder.img.setImageBitmap(BitmapFactory.decodeFile(data.imageAddr));
return view;
}
private class ViewHolder
{
private final TextView txt;
private final ImageView img;
private ViewHolder(View view)
{
txt = (TextView) view.findViewById(R.id.txt);
img = (ImageView) view.findViewById(R.id.img);
}
}
}
Un ListView di base con un ArrayAdapter
Per impostazione predefinita, ArrayAdapter
crea una vista per ciascun elemento dell'array chiamando toString()
su ciascun elemento e posizionando il contenuto in una TextView
.
Esempio:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
dove android.R.layout.simple_list_item_1
è il layout che contiene un TextView
per ogni stringa nell'array.
Quindi chiama semplicemente setAdapter()
sul tuo ListView
:
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
Per utilizzare qualcosa di diverso da TextViews per la visualizzazione dell'array, ad esempio, ImageViews, o per avere alcuni dati oltre a risultati toString()
, riempire le viste, sovrascrivere getView(int, View, ViewGroup)
per restituire il tipo di visualizzazione desiderato. Controlla questo esempio .