Android
ListView
Szukaj…
Wprowadzenie
ListView to grupa widoków, która grupuje kilka elementów ze źródła danych, takich jak tablica lub baza danych, i wyświetla je na liście z możliwością przewijania. Dane są powiązane z widokiem listy przy użyciu klasy adaptera.
Uwagi
ListView
to grupa widoków, która wyświetla listę przewijalnych elementów.
Elementy listy są automatycznie wstawiane do listy za pomocą Adapter
który pobiera zawartość ze źródła, takiego jak zapytanie tablicy lub bazy danych, i konwertuje każdy wynik elementu do widoku umieszczonego na liście.
Gdy treść twojego układu jest dynamiczna lub nie jest z góry określona, możesz użyć układu, który AdapterView
aby zapełnić układ widokami w czasie wykonywania. Podklasa klasy AdapterView
używa Adapter
do wiązania danych z jego układem.
Przed użyciem ListView
należy również sprawdzić przykłady RecyclerView
.
Filtrowanie za pomocą 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);
}
});
Załóżmy, że twoje zapytanie będzie uruchamiane za każdym razem, gdy użytkownik wpisze w 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) {
}
});
Niestandardowy ArrayAdapter
Domyślnie klasa ArrayAdapter tworzy widok dla każdego elementu tablicy, wywołując toString()
dla każdego elementu i umieszczając zawartość w TextView.
Aby utworzyć złożony widok dla każdego elementu (na przykład, jeśli chcesz ImageView dla każdego elementu tablicy), rozszerz klasę ArrayAdapter i zastąp metodę getView()
, aby zwrócić getView()
typ widoku dla każdego elementu.
Na przykład:
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);
}
}
}
Podstawowy widok listy z ArrayAdapter
Domyślnie ArrayAdapter
tworzy widok dla każdego elementu tablicy, wywołując toString()
dla każdego elementu i umieszczając zawartość w TextView
.
Przykład:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
gdzie android.R.layout.simple_list_item_1
to układ, który zawiera TextView
dla każdego łańcucha w tablicy.
Następnie po prostu wywołaj setAdapter()
na ListView
:
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
Aby użyć do wyświetlania tablic czegoś innego niż TextViews, na przykład ImageViews, lub aby niektóre dane oprócz wyników toString()
wypełniały widoki, zastępuj getView(int, View, ViewGroup)
aby zwrócić getView(int, View, ViewGroup)
typ widoku. Sprawdź ten przykład .