Динамический ListView в приложении для Android

Существует ли рабочий пример там, который демонстрирует, как добавить дополнительные строки в ListView динамично? Например:

  1. Вы вытягиваете каналы RSS от различных доменов
  2. Вы тогда отображаете первые 10 объектов в ListView (в то время как у Вас есть другие потоки, работающие, в фоновом режиме продолжают вытягивать подачу),
  3. Вы прокручиваете и добираетесь до нижней части Списка и щелчка по кнопке для просмотра большего количества объектов
  4. ListView будет тогда добавлен с дополнительными 10 объектами, который делает 20 объектов теперь всего.

Совет, как выполнить это?

Nicholas

33
задан Nicholas Key 16 December 2009 в 21:11
поделиться

1 ответ

Чтобы добавить новый элемент в ваш список динамически, вы должны получить класс адаптера из вашего ListActivity и просто добавить новые элементы. Когда вы добавляете элементы непосредственно в адаптер, для вас автоматически вызывается notifyDataSetChanged - и представление обновляется само.

Вы также можете предоставить свой собственный адаптер (расширяющий ArrayAdapter) и переопределить конструктор, принимающий параметр List. Вы можете использовать этот список так же, как и адаптер, но в этом случае вам придется самостоятельно вызвать adapter.notifyDataSetChanged () - чтобы обновить представление.
Пожалуйста, взгляните на пример ниже:

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

}

Вы можете расширить приведенный выше пример и добавить кнопку «еще», которая просто добавляет новые элементы в ваш адаптер (или вектор).
С уважением!

53
ответ дан 27 November 2019 в 18:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: