Ricerca…


introduzione

ListView è un gruppo di visualizzazione che raggruppa diversi elementi da un'origine dati come una matrice o un database e li visualizza in un elenco a scorrimento. I dati sono associati con listview utilizzando una classe Adapter.

Osservazioni

ListView è un gruppo di viste che visualizza un elenco di elementi scorrevoli.
Gli elementi dell'elenco vengono automaticamente inseriti nell'elenco utilizzando un Adapter che estrae il contenuto da un'origine come una query dell'array o del database e converte ciascun risultato di un elemento in una vista inserita nell'elenco.

Quando il contenuto del layout è dinamico o non predeterminato, è possibile utilizzare un layout che sottoclassi AdapterView per popolare il layout con le visualizzazioni in fase di esecuzione. Una sottoclasse della classe AdapterView utilizza un Adapter per associare i dati al relativo layout.

Prima di utilizzare ListView è necessario controllare anche gli esempi di RecyclerView .

Filtro con 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);
     }
});

Diciamo che la tua query verrà eseguita ogni volta che l'utente digita un 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) {

        }
    });

Custom ArrayAdapter

Per impostazione predefinita, la classe ArrayAdapter crea una vista per ogni elemento dell'array chiamando toString() su ciascun elemento e posizionando il contenuto in un TextView.

Per creare una vista complessa per ciascun elemento (ad esempio, se si desidera un ImageView per ciascun elemento dell'array), estendere la classe ArrayAdapter e sovrascrivere il metodo getView() per restituire il tipo di visualizzazione desiderato per ciascun elemento.

Per esempio:

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);
         }
    }
}

Un ListView di base con un ArrayAdapter

Per impostazione predefinita, ArrayAdapter crea una vista per ciascun elemento dell'array chiamando toString() su ciascun elemento e posizionando il contenuto in una TextView .

Esempio:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, myStringArray);

dove android.R.layout.simple_list_item_1 è il layout che contiene un TextView per ogni stringa nell'array.

Quindi chiama semplicemente setAdapter() sul tuo ListView :

ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);

Per utilizzare qualcosa di diverso da TextViews per la visualizzazione dell'array, ad esempio, ImageViews, o per avere alcuni dati oltre a risultati toString() , riempire le viste, sovrascrivere getView(int, View, ViewGroup) per restituire il tipo di visualizzazione desiderato. Controlla questo esempio .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow