ListView Item选择问题解决之道小bug的解决

原博文地址:

http://www.2cto.com/kf/201206/137476.html


非常好的一篇文章,在Android开发里ListView用的很多,很多时候都需要点击下拉。不过原文也提到了一个bug没解决:


里面有Item的选择问题,用的方法比较笨,要遍历一遍,把所有的item全部都设置一下,应该是很浪费资源的。还有一个问题就是,当listview的item多于一个屏幕的时候,会出现重复选择问题,就是当你选中一项滑动的时候,可能会发现滑动后出现的某项也是在选中状态,这个问题令人十分抓狂。见网上有个方法是:在adapter的getView里面不使用convertview。每一个view都是重新创建一个。能够解决问题,但是还是有点浪费资源。


我稍微修改了一下,加了一个数组用来标示ListView里item的打开还是关闭状态,重新绘制的时候根据对应数组下标里的1,0值来判断是不是要打开这个item,测试,无误。红色为添加的代码,读者 可以自己对比,有什么问题欢迎指出。貌似用boolean类型更省一点,没关系我只是指出这个bug解决思想。


package cn.demo;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;


public class ListAdapter extends BaseAdapter {
private Context mContext;
private View mLastView;
private int mLastPosition;
    private int [] indVisble = new int [30];
    

public ListAdapter(Context context) {
this.mContext = context;
for(int i=0;i<30;i++)
indVisble[i] = 0;
}



@Override
public int getCount() {
return 30;
}


@Override
public Object getItem(int position) {
return null;
}


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


@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
//View v;
if(convertView == null ) {
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(R.layout.list_item, null);
holder =new Holder();
holder.textView = (TextView)convertView.findViewById(R.id.textView);
holder.UEFAView = (ImageView)convertView.findViewById(R.id.image_uefa);
holder.mascotView = (ImageView)convertView.findViewById(R.id.image_mascot);
holder.hint = convertView.findViewById(R.id.hint_image);
/*if(indVisble[position] == 1)
{
holder.hint.setVisibility(View.VISIBLE);
}*/
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
if(indVisble[position] == 0)
{
holder.hint.setVisibility(View.GONE);
}
else
{
holder.hint.setVisibility(View.VISIBLE);
}
}
holder.textView.setText("Hello,It is " + position);
return convertView;
}

class Holder {
TextView textView;
ImageView UEFAView;
ImageView mascotView;
View hint;
}

public void changeImageVisable(View view,int position) {
/*if(mLastView != null && mLastPosition != position ) {
// Holder holder = (Holder) mLastView.getTag();
Holder holder = new Holder();
holder.hint = mLastView.findViewById(R.id.hint_image);
switch(holder.hint.getVisibility()) {
case View.VISIBLE:
holder.hint.setVisibility(View.GONE);
indVisble[position] = 0;
break;
default :
break;
}
}*/
mLastPosition = position;
        mLastView = view;
        Holder holder = (Holder) view.getTag();
switch(holder.hint.getVisibility()) {
case View.GONE:
holder.hint.setVisibility(View.VISIBLE);
indVisble[position] = 1;
break;
case View.VISIBLE:
holder.hint.setVisibility(View.GONE);
indVisble[position] = 0;
break;
    default :
    break;
}
//notifyDataSetChanged();
}


}

 

完整源代码链接:

http://download.csdn.net/detail/oranland/5688617

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值