天天看点

ListView的优化、两种复用View的方式

方式一:

1、使ViewHolder继承LinearLayout

2、在ViewHolder中findViewById

3、向外暴露一个方法用来赋值

个人觉得:使用这种方式更有利于为item中的某个控件设置点击事件。

public class ListViewAdapter1 extends AppCompatActivity {

    private ListView mListView;
    private MyAdapter adapter;
    private List<String> mList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view_adapter1);
        init();
    }

    private void init() {
        initView();
        initDatas();
        initAdapter();

        mListView.setAdapter(adapter);
    }

    private void initAdapter() {
        adapter = new MyAdapter();
    }

    private void initDatas() {
        mList = new ArrayList<>();
        for(int i = ;i<;i++){
            mList.add("数据"+i);
        }
    }

    private void initView() {
        mListView = (ListView) findViewById(R.id.listView1);
    }


    private class MyAdapter extends BaseAdapter{

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

        @Override
        public Object getItem(int i) {
            return mList.get(i);
        }

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            MyViewHolder holder;
            if(view != null){
                holder = (MyViewHolder) view;
            }else {
                holder = new MyViewHolder(ListViewAdapter1.this);
            }

            holder.setViewContent(i);
            return holder;
        }

        public class MyViewHolder extends LinearLayout{
            TextView textView;
            public MyViewHolder(Context context) {
                super(context);
                //一定要写this
                View view = View.inflate(ListViewAdapter1.this,R.layout.layout_item,this);
                textView = (TextView) view.findViewById(R.id.text);
            }

            public void setViewContent(int position){
                textView.setText(mList.get(position));
            }
        }
    }
}
           

方式二:

这种方式是最常用的,需要注意的就是设置tag。

public class ListViewAdapter2 extends AppCompatActivity {

    private MyAdapter adapter;
    private ListView mListView;
    private List<String> mList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view_adapter2);
        init();
    }

    private void init() {
        initView();
        initDatas();
        initAdapter();
        mListView.setAdapter(adapter);
    }

    private void initAdapter() {
        adapter = new MyAdapter();
    }

    private void initDatas() {
        mList = new ArrayList<>();
        for(int i = ;i<;i++){
            mList.add("数据"+i);
        }
    }

    private void initView() {
        mListView = (ListView) findViewById(R.id.listView2);
    }

    private class MyAdapter extends BaseAdapter {

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

        @Override
        public Object getItem(int i) {
            return mList.get(i);
        }

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            MyViewHolder holder;
            if(view == null){
                holder = new MyViewHolder();
                //最好把false加上
                view = LayoutInflater.from(ListViewAdapter2.this).inflate(R.layout.layout_item, viewGroup,false);
                holder.textView = (TextView) view.findViewById(R.id.text);
                view.setTag(holder);
            }else {
                holder = (MyViewHolder) view.getTag();
            }
            holder.textView.setText(mList.get(i));
            return view;
        }

        private class MyViewHolder{
            TextView textView;
        }
    }
}
           

布局就不写啦,嘿嘿,都是ListView,条目的是一个TextView。