checkbox-Android在ListView中使用CheckBox出现滚动自动选中的问题。

问题描述

Android在ListView中使用CheckBox出现滚动自动选中的问题。

1、列表子项对象中有state字段为0表示checkBox选中,为1表示未选中。
2、滚动时会出现自动选中checkBox框的情况,但是选中CheckBox框会进行关注操作。
3、进行了checkBox状态的保存,需要在getView中调用setCheck的方法。
以下是源代码,求高手救急!
package com.yang.gaokao.adapter;

import java.util.ArrayList;
import java.util.HashMap;http://ask.csdn.net/questions?type=reward#
import java.util.List;
import java.util.Map;

import com.way.util.T;
import com.yang.gaokao.R;
import com.yang.gaokao.constant.ConstantUtil;
import com.yang.gaokao.model.FocusedMajorBaseResBean;
import com.yang.gaokao.model.FocusedMajorResBean;
import com.yang.gaokao.util.Util;

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

public class FocusedMajorListAdapter extends BaseAdapter{

private Context mContext;
private List<FocusedMajorBaseResBean> list;
private Map<Integer, String> isSelected;
private Map<Integer, CheckBox> cbHashs;
public FocusedMajorListAdapter(Context context, FocusedMajorResBean resBean) {
    mContext = context;
    list = resBean.getBody();
    cbHashs = new HashMap<Integer, CheckBox>();
    //这儿定义isSelected这个map是记录每个listitem的状态,初始状态全部为false。
    isSelected = new HashMap<Integer, String>();
    for (int i = 0; i < list.size(); i++) {
        isSelected.put(i, list.get(i).getState());
    }
}

public FocusedMajorListAdapter(Context context, List<FocusedMajorBaseResBean> beans) {
    mContext = context;
    list = beans;
}

public void addData(List<FocusedMajorBaseResBean> data) {
    if (list == null) {
        list = new ArrayList<FocusedMajorBaseResBean>();
    }
    list.addAll(data);
    notifyDataSetChanged();
}

public void addDataAtFront(List<FocusedMajorBaseResBean> data) {
    List<FocusedMajorBaseResBean> old = list;
    list = new ArrayList<FocusedMajorBaseResBean>();
    list.addAll(data);
    list.addAll(old);
    notifyDataSetChanged();
}

public void replaceData(List<FocusedMajorBaseResBean> data) {
    this.list = data;
    notifyDataSetChanged();
}

public List<FocusedMajorBaseResBean> getList() {
    return list;
}

@Override
public int getCount() {
    return list == null ? 0 : list.size();
}

@Override
public Object getItem(int position) {
    return list == null ? null : list.get(position);
}

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

private CheckBox cbFocus;
@Override
public View getView( final int position, View convertView, ViewGroup parent) {
    Holder holder = null;
    if( convertView == null ){
        convertView = LayoutInflater.from(mContext).inflate(
                R.layout.j_item_focused_major_list, null);
        holder = new Holder();
        holder.tvSpecialtyName = (TextView)
                convertView.findViewById(R.id.specialtyName);
        holder.tvSpecialtyCode = (TextView)
                convertView.findViewById(R.id.specialtyCode);
        holder.tvDegreeName = (TextView)
                convertView.findViewById(R.id.degreeName);
        holder.tvSchoolingPeriod = (TextView)
                convertView.findViewById(R.id.schoolingPeriod);
        convertView.setTag(holder);

    }else{
        holder = (Holder) convertView.getTag();
    }
    cbFocus = (CheckBox)
            convertView.findViewById(R.id.btnFocus);
    cbHashs.put(position,cbFocus);

    final FocusedMajorBaseResBean itemBean = list.get(position);

    holder.tvSpecialtyName.setText(Util.convertNullToOhter(itemBean.getName()));
    holder.tvSpecialtyCode.setText("专业代码:"+Util.convertNullToOhter(itemBean.getSpecialtyCode()));
    holder.tvDegreeName.setText("授予学位:" + Util.convertNullToOhter(itemBean.getDegreeName()) );
    holder.tvSchoolingPeriod.setText("修学年限:"+ Util.convertNullToOhter(itemBean.getSchoolingPeriod()) );

    String state = Util.convertNullToZero(itemBean.getState());
    //在初始化CheckBox状态和设置状态变化监听事件之前,先把状态变化监听事件设置为null

    if ( isSelected.get(position).equals(ConstantUtil.FOCUS_YES) ) {
        cbHashs.get(position).setText("已关注");
        cbHashs.get(position).setChecked(true);
    }else {
        cbHashs.get(position).setText("关注");
        cbHashs.get(position).setChecked(false);
    }

    cbHashs.get(position).setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            String user_id = mContext.getSharedPreferences(ConstantUtil.USER_SHARE_PREFERENCES,
                    Context.MODE_PRIVATE).getString(ConstantUtil.USER_ID,"");
            if ( isChecked ) {
                //关注
                isSelected.put(position, ConstantUtil.YES);
                cbHashs.get(position).setText("已关注");

// T.showShort(mContext, "关注");
// Util.requestMyCollect(mContext, user_id, itemBean.getId(),
// ConstantUtil.COLECT_TYPE_MAJ, ConstantUtil.COLECT_IS_ADD, null);
}else {
//取消关注
isSelected.put(position, ConstantUtil.NO);
cbHashs.get(position).setText("关注");
// T.showShort(mContext, "取消关注");
// Util.requestMyCollect(mContext, user_id, itemBean.getId(),
// ConstantUtil.COLECT_TYPE_MAJ, ConstantUtil.COLECT_IS_UPDATE, null);
}
}
} );

    return convertView;
}

public class Holder{
    TextView tvSpecialtyName,tvSpecialtyCode,tvDegreeName,tvSchoolingPeriod;
}

}

解决方案

Android ListView中使用CheckBox等的混乱问题
关于listview中checkbox的选中问题

解决方案二:

Android ListView中使用CheckBox等的混乱问题
关于listview中checkbox的选中问题

解决方案三:

建议为指定控件,设置tag,再根据tag提取,达到一一对应。

解决方案四:

1、将cbFocus也作为Holder的成员。

2、为FocusedMajorBaseResBean这个类增加一个成员变量isSelected,表示是否选中了。

3、setOnCheckedChangeListener(),每次选择/取消选择后,修改List list中对应元素的isSelected属性:list.get(position).isSelected=true; 或 list.get(position).isSelected=false。

4、在getView() 中根据FocusedMajorBaseResBean的isSelected属性,判断cbFocus的状态。

5、不需要下面两个变量纪录选择的信息了:

private Map<Integer, String> isSelected;
private Map<Integer, CheckBox> cbHashs;

6、我修改后的代码如下,由于我没有你的一些类,所以需要你自己验证:

public class FocusedMajorListAdapter extends BaseAdapter {
private Context mContext;
private List<FocusedMajorBaseResBean> list;

public FocusedMajorListAdapter(Context context, FocusedMajorResBean resBean) {
    mContext = context;
    list = resBean.getBody();
}

public FocusedMajorListAdapter(Context context,
        List<FocusedMajorBaseResBean> beans) {
    mContext = context;
    list = beans;
}

public void addData(List<FocusedMajorBaseResBean> data) {
    if (list == null) {
        list = new ArrayList<FocusedMajorBaseResBean>();
    }
    list.addAll(data);
    notifyDataSetChanged();
}

public void addDataAtFront(List<FocusedMajorBaseResBean> data) {
    List<FocusedMajorBaseResBean> old = list;
    list = new ArrayList<FocusedMajorBaseResBean>();
    list.addAll(data);
    list.addAll(old);
    notifyDataSetChanged();
}

public void replaceData(List<FocusedMajorBaseResBean> data) {
    this.list = data;
    notifyDataSetChanged();
}

public List<FocusedMajorBaseResBean> getList() {
    return list;
}

@Override
public int getCount() {
    return list == null ? 0 : list.size();
}

@Override
public FocusedMajorBaseResBean getItem(int position) {
    return list == null ? null : list.get(position);
}

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    Holder holder = null;
    if (convertView == null) {
        convertView = LayoutInflater.from(mContext).inflate(
                R.layout.j_item_focused_major_list, null);
        holder = new Holder();
        holder.cbFocus = (CheckBox) convertView.findViewById(R.id.checkbox);
        holder.tvSpecialtyName = (TextView) convertView
                .findViewById(R.id.specialtyName);
        holder.tvSpecialtyCode = (TextView) convertView
                .findViewById(R.id.specialtyCode);
        holder.tvDegreeName = (TextView) convertView
                .findViewById(R.id.degreeName);
        holder.tvSchoolingPeriod = (TextView) convertView
                .findViewById(R.id.schoolingPeriod);
        convertView.setTag(holder);
    } else {
        holder = (Holder) convertView.getTag();
    }
    final FocusedMajorBaseResBean itemBean = list.get(position);

    holder.tvSpecialtyName.setText(Util.convertNullToOhter(itemBean
            .getName()));
    holder.tvSpecialtyCode.setText("专业代码:"
            + Util.convertNullToOhter(itemBean.getSpecialtyCode()));
    holder.tvDegreeName.setText("授予学位:"
            + Util.convertNullToOhter(itemBean.getDegreeName()));
    holder.tvSchoolingPeriod.setText("修学年限:"
            + Util.convertNullToOhter(itemBean.getSchoolingPeriod()));

    if (itemBean.isSelected) {
        holder.cbFocus.setText("已关注");
        holder.cbFocus.setChecked(true);
    } else {
        holder.cbFocus.setText("关注");
        holder.cbFocus.setChecked(false);
    }

    holder.cbFocus
            .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    String user_id = mContext.getSharedPreferences(
                            ConstantUtil.USER_SHARE_PREFERENCES,
                            Context.MODE_PRIVATE).getString(
                            ConstantUtil.USER_ID, "");
                    // 设置是否选择了,然后刷新控件
                    getItem(position).isSelected = isChecked;
                    if (isChecked) {
                        holder.cbFocus.setText("已关注");
                        holder.cbFocus.setChecked(true);
                    } else {
                        holder.cbFocus.setText("关注");
                        holder.cbFocus.setChecked(false);
                    }
                }
            });
    return convertView;
}

public class Holder {
    CheckBox cbFocus;
    TextView tvSpecialtyName, tvSpecialtyCode, tvDegreeName,
            tvSchoolingPeriod;
    }
}

解决方案五:

原因,listview 的 getview是复用的。也就是你在翻滚页面时,如果也就是
} else {
holder = (Holder) convertView.getTag();
}
这里。

    所以结果就是要每次将所有初始化数据都要写成
    if()

    else
    补上初始值 即可

解决方案六:

holder.cbFocus.setChecked这个函数的调用会触发onCheckedChanged

时间: 2024-10-29 16:33:39

checkbox-Android在ListView中使用CheckBox出现滚动自动选中的问题。的相关文章

Android MVP模式ListView中嵌入checkBox的使用方法_Android

MVP模式 ListView中嵌入checkBox的使用 本文写的是一个小demo,如何在ListView中嵌入checkBox配合使用,本篇文章与前面的嵌入Button类似,同样的采用MVP模式的写代码,本次案例中会有几个小细节,我将会在案例中介绍. 程序基本框架如下: View层: MainActivity.java public class MainActivity extends AppCompatActivity implements ViewInter<MyBean>{ //Lis

Android MVP模式ListView中嵌入checkBox的使用方法

MVP模式 ListView中嵌入checkBox的使用 本文写的是一个小demo,如何在ListView中嵌入checkBox配合使用,本篇文章与前面的嵌入Button类似,同样的采用MVP模式的写代码,本次案例中会有几个小细节,我将会在案例中介绍. 程序基本框架如下: View层: MainActivity.java public class MainActivity extends AppCompatActivity implements ViewInter<MyBean>{ //Lis

如何使用 listview 中的 checkbox?

问题描述 如何使用 listview 中的 checkbox? 我在listview中设置了一个checkbox,adapter 如下: @Override public View getView(int position, View convertView, ViewGroup parent) { ViewTag viewTag; if(convertView == null) { convertView = myInflater.inflate(R.layout.row, null); vi

微博-android,Listview中item点击变色冲突

问题描述 android,Listview中item点击变色冲突 我想要像微博一样,当点击评论.转发.赞3个按钮的时候,只有按钮变色. 点击其他地方时,整个item都变色. 然后我为最外层的布局和"评论.点赞.转发"3个按钮的布局都设置了selector,但结果是无论点击item的哪个地方,都是整个布局都变色.怎么修改都不行,不知是哪里出了问题 <selector xmlns:android="http://schemas.android.com/apk/res/and

uc浏览器-Android 在listview中实现视频播放和全屏

问题描述 Android 在listview中实现视频播放和全屏 比如 新的UC浏览器中的视频 网易新闻的视听 效果,这是我能拿出的最大的悬赏 请大神赐教 解决方案 http://download.csdn.net/detail/u012440207/7978157 你可以再做一个activity,传值,在新的activity播放http://jingyan.baidu.com/article/86fae346c8b0013c49121a2a.html 解决方案二: 一般listview展示的都

button点击事件-Android开发listView中的Button点击事件被拦截

问题描述 Android开发listView中的Button点击事件被拦截 根据http://blog.csdn.net/boylinux/article/details/8860443 这位大神的帖子,我的代码如下,现在的问题是Listview中的Button和imageview和textview控件点击之后不会响应,而在滑动一下Listview后,之前的点击事件才会响应,导致这个问题的原因不明,但是如果不用HashMap这个MAP的话,就不会有这个问题,请问大神们这是为什么呢?代码如下: p

ist iew-跪求:Android在listview中item没有type,如何控制展示不同类型的图片

问题描述 跪求:Android在listview中item没有type,如何控制展示不同类型的图片 在一个界面中,一个接口有很多的图片,一张大图,下面4张小图,在接着两个大图,后面两张小图,就这个模式展示,想不到用什么方法. 解决方案 没理解你这是什么样的布局,想要展示成什么样. 解决方案二: 这个不是在布局文件里布局好的,然后在代码里设置好,最后填充进listview的吗? 如果回答对您有帮助,请采纳 解决方案三: 确实没有理解到你想要做成什么效果 解决方案四: 如果没理解错的话你可以用瀑布流

android的listview中的自定义adapter初次打开不显示缓存的网络图片

问题描述 android的listview中的自定义adapter初次打开不显示缓存的网络图片 求助,小弟最近在写用listview 的 adapter ,在 imageview 上显示网络图片,缓存下来的图片保存成 bitmap , 在 adapter 中的 getView 设置了 imageView_image.setImageBitmap(bitmap); 但不知为何每第一次打开列表图片等待很长总是不显示,但在 listview 上下滚动的时候显示出来了,求解 解决方案 你第一次打开的时候

android代码优化----ListView中自定义adapter的封装

[正文] [引入] 我们一般编写listView的时候顺序是这样的: 需要展示的数据集List<T> 为这个数据集编写一个ListView 为这个ListView编写一个Adapter,一般继承自BaseAdapter 在BaseAdapter内部编写一个ViewHolder类,对应ListView里面的item控件,提高控件的查询效率 分析: List<T>:ListView --> Adapter extends BaseAdapter --> ViewHolder