Android
Посмотреть список
Поиск…
Вступление
ListView - это группа представлений, которая группирует несколько элементов из источника данных, например массива или базы данных, и отображает их в списке прокрутки. Данные привязаны к списку с использованием класса Adapter.
замечания
ListView
- это группа представлений, которая отображает список прокручиваемых элементов.
Элементы списка автоматически вставляются в список с помощью Adapter
который извлекает контент из источника, такого как массив или запрос базы данных, и преобразует результат каждого элемента в представление, которое помещено в список.
Когда содержимое вашего макета будет динамическим или не определено заранее, вы можете использовать макет, который подклассифицирует AdapterView
для заполнения макета с помощью представлений во время выполнения. В подклассе класса AdapterView
используется Adapter
для привязки данных к его компоновке.
Перед использованием ListView
вы также должны проверить примеры RecyclerView
.
Фильтрация с помощью 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);
}
});
Скажем, ваш запрос будет запускаться каждый раз, когда пользователь вводит в 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) {
}
});
Пользовательский массив ArrayAdapter
По умолчанию класс ArrayAdapter создает представление для каждого элемента массива, вызывая toString()
для каждого элемента и помещая содержимое в TextView.
Чтобы создать сложный вид для каждого элемента (например, если вы хотите ImageView для каждого элемента массива), расширьте класс ArrayAdapter и переопределите метод getView()
чтобы вернуть тип представления, который вы хотите для каждого элемента.
Например:
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);
}
}
}
Основной ListView с ArrayAdapter
По умолчанию ArrayAdapter
создает представление для каждого элемента массива, вызывая toString()
для каждого элемента и помещая содержимое в TextView
.
Пример:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
где android.R.layout.simple_list_item_1
- это макет, содержащий TextView
для каждой строки массива.
Затем просто вызовите setAdapter()
в ListView
:
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
Чтобы использовать нечто, отличное от TextView для отображения массива, например ImageViews, или для получения некоторых данных, кроме того, что результаты toString()
заполняют представления, переопределяют getView(int, View, ViewGroup)
чтобы вернуть getView(int, View, ViewGroup)
тип представления. Проверьте этот пример .