复选框取消选中得到卷轴上的自定义列表视图 [英] CheckBox gets unchecked on scroll in a custom listview

查看:97
本文介绍了复选框取消选中得到卷轴上的自定义列表视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道这个问题已经被问了一遍又一遍,但我仍然一直没有一个能够找到一个建议,真正帮助我。该复选框被选中,只要在列表中向下滚动。是的,我使用的是布尔数组来存储值,但是这仍然没有解决问题。这是我的code。请提出一个解决方案。谢谢你。

 公开查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
    // TODO自动生成方法存根
        最后ViewHolder持有人;
最终布尔[] itemChecked =新的布尔[30];

    LayoutInflater充气= context.getLayoutInflater();
    如果(convertView == NULL)
    {
        convertView = inflater.inflate(R.layout.custom_list,NULL);
        持有人=新ViewHolder();
        holder.txtViewTitle =(TextView中)convertView.findViewById(R.id.title_text);
        holder.txtViewDescription =(TextView中)convertView.findViewById(R.id.description_text);
        holder.cb =(复选框)convertView.findViewById(R.id.cb);
        convertView.setTag(保持器);

    }

    其他
    {
        支架=(ViewHolder)convertView.getTag();

     }

    holder.cb.setOnCheckedChangeListener(新CompoundButton.OnCheckedChangeListener(){

            @覆盖
            公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){
                // TODO自动生成方法存根
                 itemChecked [位置] =器isChecked;
                 如果(itemChecked [位置])
                 {
                     holder.cb.setChecked(真正的);
                 }
                 其他
                 {
                     holder.cb.setChecked(假);
                 }
      holder.txtViewTitle.setText(标题[位置]);
    holder.txtViewDescription.setText(介绍[位置]);
    holder.cb.setChecked(itemChecked [位置]);
  holder.txtViewDescription.setFocusable(假);
  holder.txtViewTitle.setFocusable(假);

返回convertView;

}

}
 

解决方案

getView()被调用只要previously看不见的列表项需要绘制。既然你重新创建 itemChecked [] 每次调用此方法时,你将有新的复选框选中和不同阵列的每个结果显示的时间。 (最终在Java中不会使该领域独特的像C) 最简单的解决方法是让 itemChecked A classmember并设置/基于一个恢复复选框的状态。

 公共类MyListAdapter扩展ArrayAdapter<对象> {
    私人最终布尔[] mCheckedState;
    私人最终语境mContext;

    公共MyListAdapter(上下文的背景下,INT资源,INT textViewResourceId,列表和LT;对象>的对象){
        超(背景下,资源,textViewResourceId,对象);
        mCheckedState =新的布尔[objects.size()];
        mContext =背景;
    }


    @覆盖
    公共查看getView(INT位置,查看convertView,ViewGroup中父){
        //简化为一个复选框
        // ViewHolder和OnCheckedChangeListener东西离开了
        复选框结果=(复选框)convertView;
        如果(结果== NULL){
            结果=新的复选框(mContext);
        }
        result.setChecked(mCheckedState [位置]);
        返回结果;
    }
}
 

I know that this question has been asked over and over again but still I've not been a able to find a suggestion that really helps me. The checkbox is unchecked whenever the list is scrolled down. Yes I'm using a boolean array to store the values but this still doesn't fix the problem. Here is my code. Please suggest a solution for this. Thank you.

 public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
        final ViewHolder holder;
final boolean[] itemChecked=new boolean[30];

    LayoutInflater inflater =  context.getLayoutInflater();  
    if(convertView==null)  
    {  
        convertView = inflater.inflate(R.layout.custom_list, null);
        holder = new ViewHolder();  
        holder.txtViewTitle = (TextView) convertView.findViewById(R.id.title_text);  
        holder.txtViewDescription = (TextView) convertView.findViewById(R.id.description_text);  
        holder.cb=(CheckBox) convertView.findViewById(R.id.cb);
        convertView.setTag(holder);  

    }  

    else  
    {
        holder=(ViewHolder)convertView.getTag();  

     }  

    holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                 itemChecked[position] = isChecked;
                 if(itemChecked[position])
                 {
                     holder.cb.setChecked(true);
                 }
                 else
                 {
                     holder.cb.setChecked(false);
                 }
      holder.txtViewTitle.setText(title[position]);  
    holder.txtViewDescription.setText(description[position]);  
    holder.cb.setChecked(itemChecked[position]);
  holder.txtViewDescription.setFocusable(false);
  holder.txtViewTitle.setFocusable(false);

return convertView;  

}  

}

解决方案

getView() is called whenever a previously invisible list item needs to be drawn. Since you recreate itemChecked[] each time this method is called you will have the new checkbox unchecked and a different Array for each resulting View. (final in Java does not make that field unique like in C) Simplest way to solve that is to make itemChecked a classmember and set / restore checkbox state based on that one.

public class MyListAdapter extends ArrayAdapter<Object> {
    private final boolean[] mCheckedState;
    private final Context mContext;

    public MyListAdapter(Context context, int resource, int textViewResourceId, List<Object> objects) {
        super(context, resource, textViewResourceId, objects);
        mCheckedState = new boolean[objects.size()];
        mContext = context;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // simplified to just a Checkbox
        // ViewHolder and OnCheckedChangeListener stuff left out 
        CheckBox result = (CheckBox)convertView;
        if (result == null) {
            result = new CheckBox(mContext);
        }
        result.setChecked(mCheckedState[position]);
        return result;
    }
}

这篇关于复选框取消选中得到卷轴上的自定义列表视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆