且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在运行时动态视图添加到ListView项?

更新时间:2023-11-12 18:44:40

如果您有少数的变异可能(在你的截图,我可以看到2个不同的列表项)您有两种可能的变体:

If you have small number of possible variants (on your screenshots I can see 2 different list items) You have two possible variants:


    通过

    设置计数href=\"http://developer.android.com/reference/android/widget/BaseAdapter.html#getViewTypeCount%28%29\">this方法,并提供type对于每一个项目 - 您可以使用convertView

  1. Setup count of different types by this method, and provide type for every item - and you can use convertView.

创建元素的全列表项查看和设置的知名度,你不希望在特定的项目去看看。

Create "full" list item view and set visibility for elements, that you don't want to see in particular item.

有些code#2:

public class ListTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    List<Element> list = new ArrayList<Element>();
    list.add(new Element(0));
    list.add(new Element(0));
    list.add(new Element(1));
    list.add(new Element(0));
    list.add(new Element(1));
    list.add(new Element(1));
    list.add(new Element(0));
    list.add(new Element(0));
    list.add(new Element(1));
    list.add(new Element(1));
    list.add(new Element(1));
    list.add(new Element(0));
    list.add(new Element(0));
    list.add(new Element(1));
    list.add(new Element(0));
    list.add(new Element(0));
    ((ListView) findViewById(android.R.id.list)).setAdapter(new SampleAdapter(this, list));
}

private class SampleAdapter extends BaseAdapter {

    private List<Element> list;
    private Context context;

    public SampleAdapter(Context context, List<Element> list) {
        this.list = list;
        this.context = context;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Element getItem(int position) {
        return list.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null)
            switch (getItemViewType(position)) {
            case 0:
                convertView = new CheckBox(context);
                break;
            default:
                convertView = new Button(context);
                break;
            }
        // Output here shows that you can lay on getItemViewType(position) as indicator of convertView type or structure
        Log.e("test", getItemViewType(position) + ": " + convertView.getClass().getSimpleName());
        return convertView;
    }

    @Override
    public int getItemViewType(int position) {
        return getItem(position).type;
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}

private class Element {
    public int type;

    public Element(int type) {
        this.type = type;
    }
}
}