美文网首页
Android重拾 — ListView

Android重拾 — ListView

作者: 飞翔的小骑兵 | 来源:发表于2017-05-15 14:31 被阅读60次

    一个ListView通常有两个职责。

    (1)将数据填充到布局。

    (2)处理用户的选择点击等操作。

    第一点很好理解,ListView就是实现这个功能的。第二点也不难做到,在后面的学习中读者会发现,这非常简单。

    一个ListView的创建需要3个元素。

    (1)ListView中的每一列的View。

    (2)填入View的数据或者图片等。

    (3)连接数据与ListView的适配器

    适配器 Adapter

    一个连接数据和 AdapterView(ListView就是一个典型的 AdapterView )的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便

    BaseAdapter

    选择原因:

    1. SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖

    2. BaseAdapter的灵活性就在于它要重写很多方法

    绘制过程:

    1. 系统开始绘制ListView的时候,首先调用getCount()方法。得到它的返回值,即ListView的长度

    2. 系统调用getView()方法,根据这个长度逐一绘制ListView的每一行

    代码展示:

    privateclass MyAdapter extends BaseAdapter {
        
    private LayoutInflater mInflater;//得到一个LayoutInfalter对象用来导入布局
    
    /*构造函数*/
    public MyAdapter(Context context) {
        this.mInflater = LayoutInflater.from(context);
            }
    
            @Override
            publicint getCount() {
                
                return getDate().size();//返回数组的长度
            }
    
            @Override
            public Object getItem(int position) {
                returnnull;
            }
    
            @Override
            publiclong getItemId(int position) {
                return 0;
            }
    
            @Override
            public View getView(finalint position, View convertView, ViewGroup parent) {
                 ViewHolder holder;
                //观察convertView随ListView滚动情况
                 Log.v("MyListViewBase", "getView " + position + " " + convertView);
                if (convertView == null) {
                       convertView = mInflater.inflate(R.layout.item,null);
                       holder = new ViewHolder();
                        /*得到各个控件的对象*/
                        holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
                        holder.text = (TextView) convertView.findViewById(R.id.ItemText);
                        holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
                        convertView.setTag(holder);//绑定ViewHolder对象
                       }
                else{
                        holder = (ViewHolder)convertView.getTag();//取出ViewHolder对象
                      }
                      
                /*设置TextView显示的内容,即我们存放在动态数组中的数据*/
                holder.title.setText(getDate().get(position).get("ItemTitle").toString());
                holder.text.setText(getDate().get(position).get("ItemText").toString());
                
                 /*为Button添加点击事件*/
                 holder.bt.setOnClickListener(new OnClickListener() {
                    
                    @Override
                    publicvoid onClick(View v) {
                    Log.v("MyListViewBase", "你点击了按钮" + position);                                //打印Button的点击信息
                        
                    }
                });
                
                return convertView;
            }
        
        }
    /*存放控件*/
    public finalclass ViewHolder{
        public TextView title;
        public TextView text;
        public Button   bt;
        }
    }
    

    加载:

    当启动Activity呈现第一屏ListView的时候,convertView为零。当用户向下滚动ListView时,上面的条目变为不可见,下面出现新的条目。这时候convertView不再为空,而是创建了一系列的convertView的值。当又往下滚一屏的时候,发现第11行的容器用来容纳第22行,第12行的容器用来容纳第23行。也就是说convertView相当于一个缓存,开始为0,当有条目变为不可见,它缓存了它的数据,后面再出来的条目只需要更新数据就可以了,这样大大节省了系统资料的开销

    点击查看原文地址

    相关文章

      网友评论

          本文标题:Android重拾 — ListView

          本文链接:https://www.haomeiwen.com/subject/cbrhxxtx.html