ListView~Android基础(二)

Android基础:ListView深度解析
本文介绍了Android中ListView的使用,包括其常用属性、适配器的两种实现方式(匿名内部类和新建类继承BaseAdapter),重点讲解了通过ViewHolder优化ListView的性能,以及如何更新ListView数据,利用notifyDataSetChanged()方法刷新显示。

ListView使用

课程

1、ListView常用属性

//item被点击时的背景颜色
android:listSelector="@color/colorPrimaryDark"
//滚动缓存
android:scrollingCache="true"
android:cacheColorHint="@color/splashBackgroundColor"

2、ListView常用适配器

设置ListView适配器有两种方法,需要重写四个方法,其中主要使用getCount()、getView()方法
(1)匿名内部类

ListView.setAdapter(new BaseAdapter() {
            @Override
            public int getCount() {
            	//有多少条数据
                return 0;
            }

            @Override
            public Object getItem(int i) {
	            //返回某一条数据对象
                return null;
            }

            @Override
            public long getItemId(int i) {
            	//返回某个位置
                return 0;
            }

            @Override
            public View getView(int i, View view, ViewGroup viewGroup) {
            	 //返回一个视图
                return null;
            }
        });

(2)新建一个类继承BaseAdapter

class MyAdapter extends BaseAdapter{

    @Override
    public int getCount() {
	    //有多少条数据
        return 0;
    }

    @Override
    public Object getItem(int i) {
	    //返回某一条数据对象
        return null;
    }

    @Override
    public long getItemId(int i) {
    	//返回某个位置
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
    	 //返回一个视图
        return null;
    }
}

3、优化ListView

通过新建一个ViewHolder类,声明需要的控件变量

//新建类,声明需要的变量
    class ViewHolder {
        ImageView avatarImageView;
        TextView nametext;
        TextView agetext;
    }

实例化视图后通过setTag()存储控件,getTag()获取视图数据对象viewHolder

 public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder;

        //返回一个视图,if判断为空时才再次实例化视图
        if (view == null) {
            view = mlayoutInflater.inflate(R.layout.item_phone_book_friend, null);
            viewHolder = new ViewHolder();
            viewHolder.avatarImageView = view.findViewById(R.id.avatar_text_view);
            viewHolder.nametext = view.findViewById(R.id.name_text_view);
            viewHolder.agetext = view.findViewById(R.id.age_text_view);
            //settag()储存要显示的视图数据
            view.setTag(viewHolder);
        } else {
        	//gettag()获取视图数据对象
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.agetext.setText(muUserinfos.get(i).getmUserName());
        viewHolder.nametext.setText(String.valueOf(muUserinfos.get(i).getMAge()));
        viewHolder.avatarImageView.setImageResource(R.drawable.ic_launcher);

        return view;
    }

完整代码

//新建MyAdapter类继承BaseAdapter
public class MyAdapter extends BaseAdapter {

	//上下文
    private Context mcontext;

	//新建数据集合
    private List<Userinfo> muUserinfos = new ArrayList<Userinfo>();

	//视图填充器
    private LayoutInflater mlayoutInflater;

	//有参构造函数
    public PhoneBookAdapter(Context context, List<Userinfo> userinfos) {
    	//上下文
        mcontext = context;
        muUserinfos = userinfos;
		//获取视图填充器服务
        mlayoutInflater = (LayoutInflater) mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        //有多少条数据
        return muUserinfos.size();
    }

    @Override
    public Object getItem(int i) {
        //返回某一条数据对象
        return muUserinfos.get(i);
    }

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

    /**
     * 设置不同的视图风格
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {

        return super.getItemViewType(position);
    }

    /**
     * 每一行数据显示在界面,用户看到时
     *
     * @param i
     * @param view
     * @param viewGroup
     * @return
     */
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder;

        //返回一个视图,if判断为空时才再次实例化视图
        //view=View.inflate(mcontext,R.layout.item_phone_book_friend,null);//另一种视图绑定
        if (view == null) {
            view = mlayoutInflater.inflate(R.layout.item_phone_book_friend, null);
            viewHolder = new ViewHolder();
            viewHolder.avatarImageView = view.findViewById(R.id.avatar_text_view);
            viewHolder.nametext = view.findViewById(R.id.name_text_view);
            viewHolder.agetext = view.findViewById(R.id.age_text_view);
            //settag()储存要显示的视图数据
            view.setTag(viewHolder);
        } else {
        	//gettag()获取视图数据对象
            viewHolder = (ViewHolder) view.getTag();
        }

        //获取控件
        //        ImageView avatarImageView = view.findViewById(R.id.avatar_text_view);
        //        TextView nametext = view.findViewById(R.id.name_text_view);
        //        TextView agetext = view.findViewById(R.id.age_text_view);

        //和数据进行绑定
        viewHolder.agetext.setText(muUserinfos.get(i).getmUserName());
        viewHolder.nametext.setText(String.valueOf(muUserinfos.get(i).getMAge()));
        viewHolder.avatarImageView.setImageResource(R.drawable.ic_launcher);

        return view;
    }

    /**
     * 刷新数据
     *
     * @param userinfos
     */
    public void refreshData(List<Userinfo> userinfos) {
        muUserinfos = userinfos;
        notifyDataSetChanged();
    }

	//新建类,声明需要的变量
    class ViewHolder {
        ImageView avatarImageView;
        TextView nametext;
        TextView agetext;
    }
}

4、更新ListView数据

调用MyAdapter类继承BaseAdapter的notifyDataSetChanged()方法刷新ListView显示的数据

//刷新数据
MyAdapter.notifyDataSetChanged();

在MyAdapter类写一个refreshData()方法,用于在更新数据时,传入新的数据再进行刷新显示

 public void refreshData(List<Userinfo> userinfos) {
    muUserinfos = userinfos;
    notifyDataSetChanged();
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值