Поиск…


Вступление

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) тип представления. Проверьте этот пример .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow