最新消息:文章中包含代码时,请遵守代码高亮规范!

关于ListView中出现错位问题解决【原创】

Android sunshine 157浏览 0评论

ListView在Android中是比较常见的控件,但是ListView也是有许多缺点的,下面我只针对ListView中出现错位问题来进行详解。

这还要从一次做商城类的项目说起,商城项目里显然少不了购物车,而购物车则是一个列表,如果用ListView来布局会造成顺序错乱,其中主要原因是ListView复用造成的。比如购物车当你把第一页全选中之后,加载第二页商品时你会发现你第一页所选中的又没了,这是一个很让人头疼的问题,相信从事Android开发的人多少肯定会遇到这样或类似的问题。

下面我们就这个问题来解决:

首先在Adapter的布局中添加如下代码:

<com.autoafs.user.view.MyCheckBox
android:id="@+id/cb_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/goods_checked"
android:button="@null"
android:checked="false"/>

把CheckBox换成了我们自定义的MyCheckBox,下面是MyCheckBox的完整代码:

package com.autoafs.user.view;

import android.content.Context;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import android.view.View;

import com.autoafs.user.R;


/**
* 自定义Checkbox,继承自ImageView,解决在ListView中冲突错位问题
*
* @author Robin
* time 2015-04-20 09:38:33
*/
public class MyCheckBox extends AppCompatImageView {

private OnCheckedChangeListener mOnCheckedChangeListener;

private boolean mChecked = false;

public MyCheckBox(Context context) {
super(context);
init(context);
}


public MyCheckBox(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}

public MyCheckBox(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
init(context);
}

private void init(Context context) {
updateState(mChecked);
setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
toggle();
}
});
}

/**
* 更新Checkbox状态显示
*/
public void updateState(boolean checked) {
if (checked) {
setBackgroundResource(R.drawable.shopping_cart_icon_selected);
} else {
setBackgroundResource(R.drawable.shopping_cart_icon_unselected);
}
mChecked = checked;
}


public void setChecked(boolean checked) {
if (mChecked != checked) {
mChecked = checked;
// 更新状态
updateState(mChecked);

if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(this, checked);
}
}
}


public boolean isChecked() {
return mChecked;
}


public void toggle() {
setChecked(!mChecked);
}

/**
* 设置check状态变化回调
*
* @param listener
*/
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mOnCheckedChangeListener = listener;
}

/**
* check状态变化回调接口
*
* @author Robin
* time 2015-04-20 09:27:00
*/
public static interface OnCheckedChangeListener {
void onCheckedChanged(MyCheckBox checkBox, boolean isChecked);
}

}

最后我们需要自定义一个变量 isChecked 来记录checkBox的变化状态

根据isChecked判断checkBox是否被选中,如添加购物车,结算购物车,删除购物车商品都需要根据这个状态判断是否被选中,这样就不会出现复用错位的问题啦。

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/24982.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者sunshine的打赏,我们会更加努力!    如果您想成为作者,请点我

发表我的评论
取消评论

表情