当我把它的滚动复选框微调适配器自动检查当我、把它、适配器、复选框

2023-09-03 22:13:25 作者:花落尽执何手

我有什么:我有一个微调,敌人我已经设置了适配器,在男女混合显示适配器下面有一个复选框和一个的TextView

这是怎么回事 ::当我选中复选框,在一排和下面的滚动,在下面的适配器的一些项目被自动选中。还当我回到前面,我检查了适配器也仍然检查

我试图做什么:: 我怎样才能在适配器preserve正确选择复选框所有德时间。当我向上和向下滚动

AdptCategories.java

 公共类AdptCategories扩展了BaseAdapter {
    ArrayList的< HashMap的<字符串,字符串>> categorySpinnerData;
    上下文语境;
    // ArrayList的<的ListObject>对象;

    公共AdptCategories(ArrayList中< HashMap的<字符串,字符串>> _categorySpinnerData,上下文_context){
        超();
        上下文= _context;
        categorySpinnerData = _categorySpinnerData;
    }

    @覆盖
    公众诠释getCount将(){
        返回categorySpinnerData.size();
    }

    @覆盖
    公共对象的getItem(INT位置){
        返回categorySpinnerData.get(位置);
    }

    @覆盖
    众长getItemId(INT位置){
        返回0;
    }

    公共查看getView(INT位置,查看convertView,ViewGroup中父){
        HashMap的<字符串,字符串> mapData = categorySpinnerData.get(位置);
        如果(convertView == NULL){
            LayoutInflater mInflater =(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.adpt_categories_spinner,NULL);
        }

        TextView的txtCategoryNameId =(TextView中)convertView.findViewById(R.id.txtCategoryNameId);
        复选框categoryChkBxId =(复选框)convertView.findViewById(R.id.categoryChkBxId);
        如果(位置== 0){
            txtCategoryNameId.setText(mapData.get(名字));
            categoryChkBxId.setVisibility(View.INVISIBLE);
        }其他{
            txtCategoryNameId.setText(mapData.get(名字));
            txtCategoryNameId.setTag(mapData.get(ID));
            categoryChkBxId.setVisibility(View.VISIBLE);
        }
        返回convertView;
    }
}
 

{编辑}

 公共类AdptCategories扩展了BaseAdapter {
    ArrayList的< HashMap的<字符串,字符串>> categorySpinnerData;
    上下文语境;
    私人的ArrayList<布尔>检查=新的ArrayList<布尔>();

    // ArrayList的<的ListObject>对象;

    公共AdptCategories(ArrayList中< HashMap的<字符串,字符串>> _categorySpinnerData,上下文_context){
        超();
        上下文= _context;
        categorySpinnerData = _categorySpinnerData;
    }

    @覆盖
    公众诠释getCount将(){
        返回categorySpinnerData.size();
    }

    @覆盖
    公共对象的getItem(INT位置){
        返回categorySpinnerData.get(位置);
    }

    @覆盖
    众长getItemId(INT位置){
        返回0;
    }

    静态类ViewHolderItem {
        TextView的txtCategoryNameId;
        静态复选框categoryChkBxId;

    }

    公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){

        ViewHolderItem viewHolder;
        HashMap的<字符串,字符串> mapData = categorySpinnerData.get(位置);

        的for(int i = 0; I< this.getCount();我++)
        {
            checked.add(我,FALSE);
        }

        ViewHolderItem.categoryChkBxId.setOnCheckedChangeListener(新OnCheckedChangeListener(){

            @覆盖
            公共无效onCheckedChanged(CompoundButton复选框,
                    布尔器isChecked){
                // TODO自动生成方法存根
                如果(器isChecked)
                {
                    checked.set(位置,真正的);
                }
                其他
                {
                    checked.set(位置,假);
                }
            }
        });
        ViewHolderItem.categoryChkBxId.setChecked(checked.get(位置));

        如果(convertView == NULL){
            LayoutInflater mInflater =(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.adpt_categories_spinner,NULL);
            //以及建立ViewHolder
            viewHolder =新ViewHolderItem();
            viewHolder.txtCategoryNameId =(TextView中)convertView.findViewById(R.id.txtCategoryNameId);
            viewHolder.categoryChkBxId =(复选框)convertView.findViewById(R.id.categoryChkBxId);

            //存储与所述视图中的保持器。
            convertView.setTag(viewHolder);
        }其他{
            //我们刚刚避免对资源的每一次调用findViewById()
            //只使用viewHolder
            viewHolder =(ViewHolderItem)convertView.getTag();
        }

        如果(位置== 0){
            viewHolder.txtCategoryNameId.setText(mapData.get(名字));
            viewHolder.categoryChkBxId.setVisibility(View.INVISIBLE);
        }其他{
            viewHolder.txtCategoryNameId.setText(mapData.get(名字));
            viewHolder.txtCategoryNameId.setTag(mapData.get(ID));
            viewHolder.categoryChkBxId.setVisibility(View.VISIBLE);
        }
        返回convertView;
    }
}
 

解决方案 岗顶多家电脑城热卖涉黄电视棒 毒害中学生 组图

这是由于意见在飞旋的循环,你所能做的就是声明一个布尔数组私人的ArrayList<布尔>检查=新的ArrayList<布尔>(); 和初始化适配器构造

 的for(int i = 0; I< this.getCount();我++)
 {
 checked.add(我,FALSE);
 }
 

和现在的GET观点方法来使用它像这样: -

  your_checkbox.setOnCheckedChangeListener(新OnCheckedChangeListener(){

        @覆盖
        公共无效onCheckedChanged(CompoundButton复选框,
                布尔器isChecked){
            // TODO自动生成方法存根
             如果(器isChecked)
             {
             checked.set(位置,真正的);
             }
             其他
             {
             checked.set(位置,假);
             }
        }
    });
    your_checkbox.setChecked(your_data.get(位置));
 

和取悦你的viewholder它是一个很好的做法。

What I have: I have a spinner, foe which I have set the adapter, the adapter displayed in coed below has a checkbox and a textview

What is happening:: When I check the checkbox in one row and scroll below, some item in the below adapter is checked automatically. also when i scroll back up the adapter i checked also remained checked

What I am trying to do:: How can I preserve the proper selection of checkbox in the adapter all teh time. when i scroll up and down

AdptCategories.java

public class AdptCategories extends BaseAdapter {
    ArrayList<HashMap<String, String>> categorySpinnerData;
    Context context;
    //ArrayList<ListObject> objects;

    public AdptCategories(ArrayList<HashMap<String, String>> _categorySpinnerData, Context _context) {
        super();
        context=_context;
        categorySpinnerData=_categorySpinnerData;
    }

    @Override
    public int getCount() {
        return categorySpinnerData.size();
    }

    @Override
    public Object getItem(int position) {
        return categorySpinnerData.get(position);
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        HashMap<String, String> mapData=categorySpinnerData.get(position);
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.adpt_categories_spinner, null);
        }

        TextView txtCategoryNameId = (TextView) convertView.findViewById(R.id.txtCategoryNameId);
        CheckBox categoryChkBxId = (CheckBox)convertView.findViewById(R.id.categoryChkBxId);
        if(position==0){
            txtCategoryNameId.setText(mapData.get("name"));
            categoryChkBxId.setVisibility(View.INVISIBLE);
        }else{
            txtCategoryNameId.setText(mapData.get("name"));
            txtCategoryNameId.setTag(mapData.get("id"));
            categoryChkBxId.setVisibility(View.VISIBLE);
        }
        return convertView;
    }
}

{EDIT}

public class AdptCategories extends BaseAdapter {
    ArrayList<HashMap<String, String>> categorySpinnerData;
    Context context;
    private ArrayList<Boolean> checked = new ArrayList<Boolean>();

    //ArrayList<ListObject> objects;

    public AdptCategories(ArrayList<HashMap<String, String>> _categorySpinnerData, Context _context) {
        super();
        context=_context;
        categorySpinnerData=_categorySpinnerData;
    }

    @Override
    public int getCount() {
        return categorySpinnerData.size();
    }

    @Override
    public Object getItem(int position) {
        return categorySpinnerData.get(position);
    }

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

    static class ViewHolderItem {
        TextView txtCategoryNameId;
        static CheckBox categoryChkBxId;

    }

    public View getView(final int position, View convertView, ViewGroup parent) {

        ViewHolderItem viewHolder;
        HashMap<String, String> mapData=categorySpinnerData.get(position);

        for (int i = 0; i < this.getCount(); i++) 
        {
            checked.add(i, false);
        }

        ViewHolderItem.categoryChkBxId.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox,
                    boolean isChecked) {
                // TODO Auto-generated method stub
                if (isChecked)
                {
                    checked.set(position,true);
                }
                else
                { 
                    checked.set(position,false);
                }  
            }
        });
        ViewHolderItem.categoryChkBxId.setChecked(checked.get(position));

        if(convertView==null){
            LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.adpt_categories_spinner, null);
            // well set up the ViewHolder
            viewHolder = new ViewHolderItem();
            viewHolder.txtCategoryNameId = (TextView) convertView.findViewById(R.id.txtCategoryNameId);
            viewHolder.categoryChkBxId = (CheckBox)convertView.findViewById(R.id.categoryChkBxId);

            // store the holder with the view.
            convertView.setTag(viewHolder);
        }else{
            // we've just avoided calling findViewById() on resource every time
            // just use the viewHolder
            viewHolder = (ViewHolderItem) convertView.getTag();
        }

        if(position==0){
            viewHolder.txtCategoryNameId.setText(mapData.get("name"));
            viewHolder.categoryChkBxId.setVisibility(View.INVISIBLE);
        }else{
            viewHolder.txtCategoryNameId.setText(mapData.get("name"));
            viewHolder.txtCategoryNameId.setTag(mapData.get("id"));
            viewHolder.categoryChkBxId.setVisibility(View.VISIBLE);
        }
        return convertView;
    }
}

解决方案

this is due to the recycling of views in spinner,what you can do is declare an boolean array private ArrayList<Boolean> checked = new ArrayList<Boolean>(); and initialize in your adapter constructor

for (int i = 0; i < this.getCount(); i++) 
 {
 checked.add(i, false);
 }

and now your get view method use it like this:-

your_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton checkbox,
                boolean isChecked) {
            // TODO Auto-generated method stub
             if (isChecked)
             {
             checked.set(position,true);
             }
             else
             { 
             checked.set(position,false);
             }  
        }
    });
    your_checkbox.setChecked(your_data.get(position));

and please your viewholder its a good practice.

 
精彩推荐
图片推荐