跟着徐宜生学Android——Android群英传第四章——Li

2017-10-09  本文已影响0人  心中愁眼前秋

[TOC]
在Android 5.X时代,RecycleView在很多地方都在逐渐取代ListView。

使用ViewHolder模式提高效率

ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在调用getView()的时候都去通过findViewById()实例化控件。
在自定义的Adapter中定义一个内部类ViewHolder,并将布局中的控件作为成员变量。

public final class ViewHolder{
    public ImageView img;
    public TextView title;
}

在getView()方法中通过视图缓存机制来重用缓存。

class ViewHolderAdapter extends BaseAdapter{
    private List<String> mData;
    private LayoutInflater mInflater;
    public ViewHolderAdapter(Context context,List<String> data){
        this.mData=data;
        mInflater = LayoutInflater.from(context);
    }
    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null){
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.viewholder_item,null);
            holder.img = (ImageView) convertView.findViewById(R.id.img);
            holder.title = (TextView) convertView.findViewById(R.id.title);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.img.setBackgroundResource(R.drawable.gift);
        holder.title.setText(mData.get(position));
        return convertView;
    }

    private class ViewHolder {
        public ImageView img;
        public TextView title;
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {
......
private ViewHolderAdapter mAdapter;
private List<String> mData;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    
    //listview.setEmptyView(findViewById(R.id.empty_view));
    mData = new ArrayList<String>();
    for (int i = 0; i < 20; i++) {
        mData.add("第" + i + "张");
    }
    mAdapter = new ViewHolderAdapter(this, mData);
    listview.setAdapter(mAdapter);
    for (int i=0;i<listview.getChildCount();i++){
        View view = listview.getChildAt(i);
    }
}

xml属性

|xml属性|描述|补充
|--|--|
|divider|项目分割线的颜色|@android:color/ ,@null分割线透明
|dividerHeight|项目分割线的高度
|scrollbars|滚动条|none不出现滚动条
|listSelector|点击效果|@android:color/transport是透明色

ListView代码属性

ListView以Item为单位进行显示。

设置 ListViewV型要显示在第几项

瞬间完成的移动

listView.setSelection(N)

平滑移动

listview.smoothScrollBy(5,10);
listview.smoothScrollByOffset(10);
listview.smoothScrollToPosition(5);

遍历ListView中的所有Item

for (int i=0;i<listview.getChildCount();i++){
    //返回组中指定文件的视图
    //通过getChildAt()来获取第i个子View
    View view = listview.getChildAt(i);
}

动态修改ListView

//保证传数据的List是同一个List而不是其他对象。
mData.add("new");
mAdapter.notifyDataSetChanged();

处理空ListView

当列表中无数据时,应该给以无数据的提示。
首先在布局中添加一个View,然后找到这个View。

listView.setEmptyView(findViewById(R.id.empty_view));

ListView滑动监听

OnTouchListener

OnSrcollListener

上一篇下一篇

猜你喜欢

热点阅读