Android:控件ListView

ListView数据的展示主要依靠是Adapter数据适配器

  • ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字
public ArrayAdapter(Context context, @LayoutRes int resource, @IdRes int textViewResourceId,@NonNull T[] objects)
//例如
ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, new String[]{"item1","item2"});
  • SimpleAdapter:同样具有良好扩展性的一个Adapter,可以自定义多种效果
public SimpleAdapter(Context context, List> data,
            @LayoutRes int resource, String[] from, @IdRes int[] to) ;
//例如
SimpleAdapter adapter = new SimpleAdapter(this, getData(),R.layout.list_2,
                new String[]{"img","text1", "text2"}, new  int[]{R.id.imv, R.id.text1, R.id.text2});

R.layout.list_2 //自定义布局包含img以及两个textview

如下布局


Android:控件ListView_第1张图片
AEBDF573-0D95-40EE-9235-332737650B3A.png
  • BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个Adapter

1、继承BaseAdapter之后,需要重写以下四个方法:getCount,getItem,getItemId,getView。
2、其中getView方法最为重要,在这里会根据实现定义好的布局确定显示的效果,并返回一个view对象在item中展示出来。
3、关于listview的优化也在getView里展现。如下代码,其实ViewHolder和contentView可以不用,直接导入布局显示内容就可以了就像下面这样,意味着有多少行就绘制多少行,如若是几千行,性能消耗就不止是一点了

    public View getView(int position, View convertView, ViewGroup parent) {
        //加载布局为一个视图
        View view=inflater.inflate(R.layout.layout_student_item,null);
        Student student=getItem(position);
        //在view视图中查找id为image_photo的控件
        ImageView imageViewIcon= (ImageView) (ImageView)convertView.findViewById(R.id.imv);
        ....
        imageViewIcon.setImageResource...
        ...
        return view;
    }
//优化后的代码
//一个是防止重绘view,二是借助tag来寻找view,这样就避免了findViewById对控件的层层查询。值得考究
@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;
        if (null == convertView) {
            convertView = mInflater.inflate(R.layout.list_2, null);
            holder.imageViewIcon = (ImageView)convertView.findViewById(R.id.imv);
            holder.textViewTitle = (TextView)convertView.findViewById(R.id.text1);
            holder.textViewDesc = (TextView)convertView.findViewById(R.id.text2);

            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }

        DataModule dataModule = mListModule.get(position);
        if (dataModule.iconResId > 0) {
            holder.imageViewIcon.setImageResource(dataModule.iconResId);
        } else {
            holder.imageViewIcon.setImageResource(R.drawable.icon_user);
        }
        ....
  }

你可能感兴趣的:(Android:控件ListView)