您的位置:首页 > 移动开发 > Android开发

Android ListView 详解 2016 干货

2016-08-25 10:47 197 查看
首先说下为什么写这篇文章,最近接手了一个离职同事的项目,点开之后看见它写的ListView真的是跪了,好坏不说,如果单单只是为了实现而”不择手段”,那么对自己的职业生涯又有什么好处?除了项目被重构,我估计如果真的有一天被技术或者客户反馈了你的职位也要被重构了。所以希望写这篇文章帮助大家,第一个将基本功扎实起来,第二个应付各种各样的ListView都不发怵,都有一套可一应对的方案。

ListView作为Android的基本控件在应用开发上是肯定会用到了。而且会出现各种各样的ListView,那么我们如何使用一种统一的方法来处理这些为了更好了用户体验而设计出来的各种不走寻常路的ListView。还有之前我也看过很多教程,说实话,都是你抄我我抄你,真正的实战型不强,而且随着设计的不断更新,那些东西很难实现我们新的需求。

那么进入我们的主题直接上干货吧,这是我之前写的一个电商类的项目,必须用到的一个环节就是购物车。


页面设计典型而简单。但是足够我们进行讲解今天的技术点了。

我们可以看到如果按钮是死的那么这个ListView显示的数据就是最基础的一个照片,一个CheckButton,加号减号一对和一个这个商品的数量。

下面有一个点击全选,然后ListView中所有的CheckButton都会亮起来。

实现的方法有很多,我就给大家讲一种模块化,易于维护的方式来实现。

首先对于加号和减号来说,我不建议写按钮监听在getView里那个控件干什么直接写setOnClickListener然后new OnClickListener(){};然后就开始写自己的项目逻辑。这样的写法第一代码量大,第二模块化也不够清楚,而且有的时候会产生一些意想不到的错误。那么我给大家写一种不会出错,易于维护的方法。

就是下面这个继承了OnClickListener的监听者类。这个类是adapter的私有内部类。

技术点一、一个ListView中多按钮监听,附带刷新网络。

private class Listener implements View.OnClickListener
{

private ImageView  shoppingcar_jian;//定义一个加号
private ImageView  shoppingcar_jia;//定义一个减号
private TextView shoppingcar_num;//定义中间的数量
private int position;//得到当前ListView点击的位置。
int temp=-1;//该项当前在购物车中的数目
int singClick=1;//设置单点,在网络访问成功之后可以继续点击

/**
**构造方法,将getView中的每一控件传递进来,然后添加监听到本类中。
**为了让一个监听可以正确的运行起来,我们需要的是有那些按钮,以及按钮当前所点的位置,根据位置得到ArrayList中的数据,然后进行操作或者处理。;
**/
public Listener(ImageView  shoppingcar_jian,ImageView  shoppingcar_jia,int position,TextView shoppingcar_num)
{
this.shoppingcar_jian=shoppingcar_jian;
this.shoppingcar_jian.setOnClickListener(this);//构造添加监听
this.shoppingcar_jia=shoppingcar_jia;
this.shoppingcar_jia.setOnClickListener(this);
this.shoppingcar_num=shoppingcar_num;
this.position=position;//得到当前的位置。
}

@Override
public void onClick(View v) {

if(temp==-1)//当第一次点击的时候将String类型的数目变成整形的数目
{
temp=Integer.parseInt(""+info.get(position).num);
}

//对加号和减号进行处理 然后更新数量
if(v.getId()==shoppingcar_jian.getId()&&temp>1&&singClick==1)
{
temp=temp-1;
shoppingcar_num.setText(temp + "");

}else
if(v.getId()==shoppingcar_jia.getId()&&singClick==1)
{
temp=temp+1;
shoppingcar_num.setText(temp + "");
}
Log.e("shoppingcar adapter",temp+"   ^    "+singClick);
//进行网络访问,如果成功那么就提示用户并且将合计的金额进行更改。
if(singClick==1&&temp>1)
{
singClick=2;
new JsonShoppingCarEditAsyGet(info.get(position).id,temp+"",new AsyCallBack<String>(){
@Override
public void onSuccess(String toast, int type, String s) throws Exception {
super.onSuccess(toast, type, s);

Toast.makeText(context,"更改成功",Toast.LENGTH_LONG).show();
info.get(position).num=temp+"";
if(info.get(position).isChecked)
{
getPrice(info,textView);
}
}

@Override
public void onEnd(String toast, int type) throws Exception {
super.onEnd(toast, type);
singClick=1;
}
}).execute(context,false);
}
}
}


在真正使用的时候只需要直接,在getView里

new Listener(viewHolder.shoppingcar_jian,viewHolder.shoppingcar_jia,viewHolder.position,viewHolder.shoppingcar_num);


就可以实现了。无论有多少按钮,怎么刷新我们都不怕,只要这样代理过来,都可以变得像写一个静态页面一样简单。

其实我写这个的好处是,第一代码易于维护第二个是模块化清楚也就是高内聚底耦合,如果我不使用监听了只需要在构造中将添加监听去掉即可。第三个就是性能高,当我的操作完成时并没有刷新整个列表而是去更改某个项,就是那里更新更新那里。

这只是一个典型的用法,其实在一个ListView中无论有多少按钮我们都只需要这样的一个内部类把监听和刷新的问题解决掉,而不是更新之后,更新ArrayList然后在舒心整个ListView如果那样真的是恶心死了!

代码简不简洁,复用性高不够,我想有点技术的人一概一眼就能判断出来了吧。

技术点二、初学者很常见的问题,已上面的checkButton为例。如果我们开始的时候让345为checked状态,那么快速的滑几下,你会发现原本没被点击的checkButton也变成了checked状态。这其中的原因,是ListView复用机制导致的问题。但是解决起来也非常的简单。

if(info.get(position).isChecked)
{
viewHolder.shopping_car_radiobutton.setChecked(true);
}else
{
viewHolder.shopping_car_radiobutton.setChecked(false);
}


只需要在原来只有if的地方给他加个else就可以了。

总结起来就是:对于ListView我们不仅要告诉他们你应该干什么,还要告诉他们你不应该干什么,尤其是这种,不是每个项都一样的数据。

技术点三、巧用notifyDataSetChanged();



有的时候我们难免为了操作,加入这种删除某一项的操作。那么我给大家的建议就是再点击删除进行网络访问的时候做如下的操作。

之前的准备在adapter里加一个这样的方法

public void remove(int position)

{

list.remove(positon);//移除数据项

notifyDataSetChanged();//刷新页面

}

在网络访问成功的时候我们就可以之久调用这个方法一句话将数据更新

@Override

onSuccess()//模拟网络访问成功的回调函数

{

adapter.remove(position);//直接调用父控件的adapter移除刷新即可。

}

这个方法主要是代码量少,使用方便简洁。千万不要做这样的事情当成功之后

list.remove(position);

Adapter adapter=new Adapter(this,list)

listView.add(list)。

这样真的是太low了!

ListView主要的技巧就是这些,其实用心去研究一种结构,对自己是提升,对别人也是一种帮助。

欢迎大家对不足的地方进行指正,也欢迎大家提一些问题,让我们一起成长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息