How to add a dynamic view to a ListView item at runtime?

后端 未结 3 754
Happy的楠姐
Happy的楠姐 2021-01-02 14:58

My problem is that I don\'t know whether I should use multiple list view or a custom listview item adapter which can grows dynamically. For example, for a particular user, t

3条回答
  •  爱一瞬间的悲伤
    2021-01-02 15:26

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

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

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

    Some code for #2:

    public class ListTestActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        List list = new ArrayList();
        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 list;
        private Context context;
    
        public SampleAdapter(Context context, List 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;
        }
    }
    }
    

提交回复
热议问题