Android 应用中的动态 ListView

Posted

技术标签:

【中文标题】Android 应用中的动态 ListView【英文标题】:Dynamic ListView in Android app 【发布时间】:2010-12-27 10:17:30 【问题描述】:

是否有一个可行的示例来演示如何在 ListView 中动态附加额外的行? 例如:

    您正在从 不同的域 然后显示前 10 个项目 在 ListView 中(当你有 中运行的其他线程 后台继续拉提要) 您滚动并到达底部 列表并单击一个按钮以 查看更多项目 ListView 随后将被附加 加上额外的 10 项,其中 现在总共生产 20 件商品。

任何建议如何做到这一点?

尼古拉斯

【问题讨论】:

【参考方案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;
           

您可以扩展上面的示例并添加“更多”按钮 - 这只是将新项目添加到您的适配器(或向量)。问候!

【讨论】:

谢谢,斜坡。我试试看 你好朋友在上面的例子中我得到了异常它告诉 set expandablelist 适配器而不是在 setListAdapter(adapter) 的 onCreate 方法中的 ListAdapter

以上是关于Android 应用中的动态 ListView的主要内容,如果未能解决你的问题,请参考以下文章

Android中的动态启动活动?

Android中的动态加载机制

Android动态主题

动态更改 colors.xml 的值以更改 android 应用程序的外观

Android中的动态加载机制--薛彦顺

如何在运行时更改动态添加的 Android 视图中的数据