ListView不同type加载数据

来源:互联网 发布:windows 网络发现 编辑:程序博客网 时间:2024/06/11 00:41

1、listView加载不同类型的数据的要点有几个地方:

(1)要重写两个方法:

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


@Override
        public int getItemViewType(int position) {
            return stus.get(position).getType();
        }


(2)在getView哪里加载布局和数据的复用的时候,记住先判断type再进行convertView是否为空的判断


(3)复用的时候还是用同一个ViewHolder,只不过字段不一样而已。

我把所有代码都写在MainActivity里面了,因为我的几个类型的布局没什么特色,所以就不上传了,只上传代:

public class MainActivity extends AppCompatActivity {
    /**
     * 造假数据
     *
     * @param savedInstanceState
     */
    List<Student> stus = new ArrayList<>();




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = (ListView) findViewById(R.id.listView);
        initData();
        listView.setAdapter(new MyAdapter());
    }


    private void initData() {
        stus.add(new Student(1, 16, "一般陈1", R.mipmap.stu1));
        stus.add(new Student(1, 17, "一般陈2", R.mipmap.stu2));
        stus.add(new Student(1, 18, "一般陈3", R.mipmap.stu3));
        stus.add(new Student(1, 19, "一般陈4", R.mipmap.stu4));
        stus.add(new Student(1, 15, "一般陈5", R.mipmap.stu5));
        stus.add(new Student(2, 16, "二般菜1", R.mipmap.stu6));
        stus.add(new Student(2, 18, "二般菜2", R.mipmap.stu7));
        stus.add(new Student(2, 20, "二般菜3", R.mipmap.stu8));
        stus.add(new Student(2, 18, "二般菜4", R.mipmap.stu9));
        stus.add(new Student(3, 18, "三般李1", R.mipmap.stu10));
        stus.add(new Student(3, 18, "三般李2", R.mipmap.stu11));
        stus.add(new Student(3, 17, "三般李3", R.mipmap.stu12));
        stus.add(new Student(3, 18, "三般李4", R.mipmap.stu13));
        stus.add(new Student(3, 16, "三般李5", R.mipmap.stu14));
        stus.add(new Student(3, 18, "三般李6", R.mipmap.stu15));
        stus.add(new Student(3, 16, "三般李7", R.mipmap.stu16));
        stus.add(new Student(3, 18, "三般李8", R.mipmap.stu17));
        stus.add(new Student(3, 17, "三般李9", R.mipmap.stu18));
        stus.add(new Student(3, 18, "三般李10", R.mipmap.stu19));
        stus.add(new Student(3, 19, "三般李11", R.mipmap.stu20));
        stus.add(new Student(3, 19, "三般李12", R.mipmap.stu21));
        stus.add(new Student(3, 18, "三般李13", R.mipmap.stu22));
    }


    private class MyAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return stus == null ? 0 : stus.size();
        }


        // 告诉Listview 一共有几种类型的条目 , ListView就会准备几个 convertView的复用池
        @Override
        public int getViewTypeCount() {
            return 4;
        }


        //根据position返回每个Item的type值,这个值不是你自己的那个type值,而是你告诉listView,你
        //将这个类型的数据在listView中的type定义为那个值,后面getView会根据这个值来加载不同条目
        //当然你也可以将这两个值写成一样,但是你不能把概念弄混了
        @Override
        public int getItemViewType(int position) {
            return stus.get(position).getType();
        }


        @Override
        public Object getItem(int position) {
            return null;
        }


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


        /**
         * @param position
         * @param convertView
         * @param parent
         * @return
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            switch (getItemViewType(position)) {
                case 1:
                    if (convertView == null) {
                        convertView = View.inflate(parent.getContext(), R.layout.item_1, null);
                        holder = new ViewHolder();
                        holder.img = (ImageView) convertView.findViewById(R.id.item1_iv);
                        holder.name = (TextView) convertView.findViewById(R.id.item1_name);
                        holder.age = (TextView) convertView.findViewById(R.id.item1_age);
                        convertView.setTag(holder);
                    } else {
                        holder = (ViewHolder) convertView.getTag();
                    }
                    holder.name.setText(stus.get(position).getName());
                    holder.img.setImageResource(stus.get(position).getImg());
                    holder.age.setText(stus.get(position).getAge() + "");
                    break;
                case 2:
                    if (convertView == null) {
                        convertView = View.inflate(parent.getContext(), R.layout.item_2, null);
                        holder = new ViewHolder();
                        holder.img = (ImageView) convertView.findViewById(R.id.item2_iv);
                        holder.name = (TextView) convertView.findViewById(R.id.item2_name);
                        holder.age = (TextView) convertView.findViewById(R.id.item2_age);
                        convertView.setTag(holder);
                    } else {
                        holder = (ViewHolder) convertView.getTag();
                    }
                    holder.name.setText(stus.get(position).getName());
                    holder.img.setImageResource(stus.get(position).getImg());
                    holder.age.setText(stus.get(position).getAge() + "");
                    break;
                case 3:
                    if (convertView == null) {
                        convertView = View.inflate(parent.getContext(), R.layout.item_3, null);
                        holder = new ViewHolder();
                        holder.img = (ImageView) convertView.findViewById(R.id.item3_iv);
                        holder.name = (TextView) convertView.findViewById(R.id.item3_name);
                        holder.age = (TextView) convertView.findViewById(R.id.item3_age);
                        convertView.setTag(holder);
                    } else {
                        holder = (ViewHolder) convertView.getTag();
                    }
                    holder.name.setText(stus.get(position).getName());
                    holder.img.setImageResource(stus.get(position).getImg());
                    holder.age.setText(stus.get(position).getAge() + "");
                    break;
            }
            return convertView;
        }
    }


    //虽然type不一样,加载的布局不一样,但是还是要讲究复用,如果几个布局的只是界面不一样,而数据类型就算不一样
    //也用同一个viewHoler,只是多加几个字段而已
    class ViewHolder {
        TextView name;
        TextView age;
        ImageView img;
    }
}

0 0
原创粉丝点击