美文网首页
跟着徐宜生学Android——Android群英传第四章——Li

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

作者: 心中愁眼前秋 | 来源:发表于2017-10-09 11:28 被阅读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

    相关文章

      网友评论

          本文标题:跟着徐宜生学Android——Android群英传第四章——Li

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