美文网首页
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