Dynamische ListView in der Android-App

Lesezeit: 3 Minuten

Gibt es ein funktionierendes Beispiel, das zeigt, wie zusätzliche Zeilen in ListView dynamisch angehängt werden? Beispielsweise:

  1. Sie ziehen RSS-Feeds von verschiedenen Domains
  2. Sie zeigen dann die ersten 10 Elemente in der ListView an (während Sie andere Threads im Hintergrund laufen lassen, ziehen Sie weiterhin Feeds)
  3. Sie scrollen und erreichen das Ende der Liste und klicken auf eine Schaltfläche, um weitere Elemente anzuzeigen
  4. die ListView wird dann mit weiteren 10 Elementen angehängt, was nun insgesamt 20 Elemente ergibt.

Irgendwelche Ratschläge, wie man dies bewerkstelligt?

Nikolaus

Dynamische ListView in der Android App
Rampen

Um Ihrer Liste dynamisch neue Elemente hinzuzufügen, müssen Sie die Adapterklasse von Ihrer ListActivity abrufen und einfach neue Elemente hinzufügen. Wenn Sie Elemente direkt zum Adapter hinzufügen, wird benachrichtigenDataSetChanged automatisch für Sie aufgerufen – und die Ansicht aktualisiert sich selbst.

Sie können auch Ihren eigenen Adapter bereitstellen (ArrayAdapter erweitern) und den Konstruktor überschreiben, der den List-Parameter verwendet. Sie können diese Liste genauso verwenden wie Adapter, aber in diesem Fall müssen Sie adapter.notifyDataSetChanged() selbst aufrufen – um die Ansicht zu aktualisieren.
Schauen Sie sich bitte das folgende Beispiel an:

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

}

Sie können das obige Beispiel erweitern und die Schaltfläche “Mehr” hinzufügen – wodurch nur neue Elemente zu Ihrem Adapter (oder Vektor) hinzugefügt werden.
Grüße!

  • Danke, Ramps. Ich werde das ausprobieren

    – Nikolaus Schlüssel

    16. Dez. 09 um 21:54

  • Hallo Freunde im obigen Beispiel erhalte ich eine Ausnahme, bei der der erweiterbare Listenadapter anstelle von ListAdapter in der onCreate-Methode bei setListAdapter (Adapter) festgelegt wird

    – shripal

    1. Apr. ’11 um 6:56

.

459320cookie-checkDynamische ListView in der Android-App

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy