Android
Listvy
Sök…
Introduktion
ListView är en visningsgrupp som grupperar flera objekt från en datakälla som array eller databas och visar dem i en rullningsbar lista. Data är bundna med listvy genom en Adapter-klass.
Anmärkningar
ListView
är en ListView
som visar en lista med rullningsbara objekt.
Listobjekten infogas automatiskt i listan med en Adapter
som drar innehåll från en källa, t.ex. en matris eller databasfråga och konverterar varje objektresultat till en vy som placeras i listan.
När innehållet i din layout är dynamiskt eller inte förutbestämt kan du använda en layout som underklasserar AdapterView
att fylla layouten med vyer vid körning. En underklass i klassen AdapterView
använder en Adapter
att binda data till dess layout.
Innan du använder ListView
bör du också kontrollera RecyclerView
exemplen.
Filtrering med marköradapter
// 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);
}
});
Låt oss säga att din fråga kommer att köras varje gång användaren skriver i ett 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) {
}
});
Anpassad ArrayAdapter
Som standard skapar ArrayAdapter-klassen en vy för varje matrisobjekt genom att ringa toString()
på varje objekt och placera innehållet i en TextView.
För att skapa en komplex vy för varje objekt (till exempel om du vill ha en ImageView för varje matrisobjekt), utökar du ArrayAdapter-klassen och åsidosätter getView()
för att returnera den typ av vy du vill ha för varje objekt.
Till exempel:
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);
}
}
}
En grundläggande ListView med en ArrayAdapter
Som standard skapar ArrayAdapter
en vy för varje matrisobjekt genom att ringa toString()
på varje objekt och placera innehållet i en TextView
.
Exempel:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
där android.R.layout.simple_list_item_1
är den layout som innehåller en TextView
för varje sträng i matrisen.
Ring sedan bara setAdapter()
på din ListView
:
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
Om du vill använda något annat än TextViews för matrisvisningen, till exempel ImageViews, eller för att ha en del data förutom toString()
fyller du vyerna, åsidosätter getView(int, View, ViewGroup)
att returnera den typ av vy du vill ha. Kontrollera detta exempel .