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 .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow