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 .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow