web-dev-qa-db-fra.com

Dynamic ListView dans Android

Existe-t-il un exemple de travail qui montre comment ajouter dynamiquement des lignes supplémentaires dans ListView? Par exemple:

  1. vous tirez des flux RSS de différents domaines
  2. vous affichez ensuite les 10 premiers éléments dans ListView (pendant que d'autres threads s'exécutent en arrière-plan, continuez à tirer les flux)
  3. vous faites défiler et atteignez le bas de la liste et cliquez sur un bouton pour afficher plus d'articles
  4. le ListView sera alors ajouté avec 10 éléments supplémentaires, ce qui fait maintenant 20 éléments au total.

Des conseils pour y parvenir?

Nicolas

33
Nicholas Key

Pour ajouter un nouvel élément à votre liste de manière dynamique, vous devez obtenir la classe d'adaptateur de votre ListActivity et simplement ajouter de nouveaux éléments. Lorsque vous ajoutez des éléments directement à l'adaptateur, notifyDataSetChanged est appelé automatiquement pour vous - et la vue se met à jour.

Vous pouvez également fournir votre propre adaptateur (étendre ArrayAdapter) et remplacer le constructeur en prenant le paramètre List. Vous pouvez utiliser cette liste comme vous utilisez l'adaptateur, mais dans ce cas, vous devez appeler vous-même adapter.notifyDataSetChanged () - pour actualiser la vue.
Veuillez consulter l'exemple ci-dessous:

public class CustomList extends ListActivity {
private LayoutInflater mInflater;
private Vector<RowData> data;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);        
    mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    data = new Vector<RowData>();
    RowData rd = new RowData("item1", "description1");
    data.add(rd);
    rd = new RowData("item2", "description2");
    data.add(rd);
    rd = new RowData("item2", "description3");
    data.add(rd);

    CustomAdapter adapter = new CustomAdapter(this, R.layout.custom_row,R.id.item, data);
    setListAdapter(adapter);        
    getListView().setTextFilterEnabled(true);
}


public void onListItemClick(ListView parent, View v, int position, long id) {
    CustomAdapter adapter = (CustomAdapter) parent.getAdapter();
    RowData row = adapter.getItem(position);        
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(row.mItem); 
    builder.setMessage(row.mDescription + " -> " + position );
    builder.setPositiveButton("ok", null);
    builder.show();
}

/**
 * Data type used for custom adapter. Single item of the adapter.      
 */
private class RowData {
    protected String mItem;
    protected String mDescription;

    RowData(String item, String description){
        mItem = item;
        mDescription = description;         
    }

    @Override
    public String toString() {
        return mItem + " " +  mDescription;
    }
}

private class CustomAdapter extends ArrayAdapter<RowData> {

    public CustomAdapter(Context context, int resource,
            int textViewResourceId, List<RowData> objects) {
        super(context, resource, textViewResourceId, objects);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        //widgets displayed by each item in your list
        TextView item = null;
        TextView description = null;

        //data from your adapter
        RowData rowData= getItem(position);


        //we want to reuse already constructed row views...
        if(null == convertView){
            convertView = mInflater.inflate(R.layout.custom_row, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        }
        // 
        holder = (ViewHolder) convertView.getTag();
        item = holder.getItem();
        item.setText(rowData.mItem);

        description = holder.getDescription();      
        description.setText(rowData.mDescription);

        return convertView;
    }
}

/**
 * Wrapper for row data.
 *
 */
private class ViewHolder {      
    private View mRow;
    private TextView description = null;
    private TextView item = null;

    public ViewHolder(View row) {
        mRow = row;
    }

    public TextView getDescription() {
        if(null == description){
            description = (TextView) mRow.findViewById(R.id.description);
        }
        return description;
    }

    public TextView getItem() {
        if(null == item){
            item = (TextView) mRow.findViewById(R.id.item);
        }
        return item;
    }       
}

}

Vous pouvez étendre l'exemple ci-dessus et ajouter le bouton "plus" - qui ajoute simplement de nouveaux éléments à votre adaptateur (ou vecteur).
Cordialement!

53
Ramps