简体   繁体   English

android中带有复选框错误的自定义列表视图

[英]custom listview with checkbox error in android

hi i am creating a custom listview with two chekboxes and problen is when i check a checkbox and scroll down another checkbox adjacent to the checked one also get checked i want to know why it is happening what should i do to avoid that error this is my code 嗨,我正在创建一个带有两个chekboxes的自定义listview,而problen是当我选中一个复选框并向下滚动到与选中的复选框相邻的另一个复选框时,我也想知道为什么会发生这种情况,我应该知道为什么会发生此错误,这是我的码

public class ListTestActivity extends ListActivity {
/** Called when the activity is first created. */
String tag = "Events";
String[] presidents;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 // Create an array of Strings, that will be put to our ListActivity
    presidents =getResources().getStringArray(R.array.pres_array);

        ArrayAdapter<Model> adapter = new InteractiveArrayAdapter(this,
                getModel());
        Log.d(tag," event");
        setListAdapter(adapter);
        Log.d(tag," 1");
    }

    private List<Model> getModel() {
        Log.d(tag,"bht");
        int index = presidents.length;
        int positio;
        String Linux;
        //List<Model> list = new ArrayList<Model>();
        /*for(positio=0;positio<=index ;++positio){
            String Linux="hai";
            List<Model> list = new ArrayList<Model>();
            list.add(get(presidents[positio]));
            list.add(get(Linux));
            Log.d(tag," 2");
                     //if(positio>=10){
            return list;

            //}
        }*/
        List<Model> list = new ArrayList<Model>();
        //int position=0;
        //List<Model> list = new ArrayList<Model>();
        //list.add(get(presidents[position]));
        for(positio=0;positio<index ;positio++){
            Linux=presidents[positio];
            list.add(get(Linux));
        }

        Log.d(tag,"bht1");
        /*list.add(get("Windows7"));
        list.add(get("Suse"));
        list.add(get("Eclipse"));
        list.add(get("Ubuntu"));
        list.add(get("Solaris"));
        list.add(get("Android"));
        list.add(get("iPhone"));*/
        // Initially select one of the items
        //list.get(1).setSelected(true);
        //String re=list.get(1);
        Log.d(tag," event1");
        return list;

    }private Model get(String s) {
        Log.d(tag," event2");
        return new Model(s);
}}


public class InteractiveArrayAdapter extends ArrayAdapter<Model> {
String tag = "Events";
private final List<Model> list;
private final Activity context;

public InteractiveArrayAdapter(Activity context, List<Model> list) {
    super(context, R.layout.rowbuttonlayout, list);
    this.context = context;
    this.list = list;
}

static class ViewHolder {
    protected TextView text;
    protected CheckBox checkbox,checkbox1;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.d(tag," 3");
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.rowbuttonlayout, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.text = (TextView) view.findViewById(R.id.label);
        viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
        viewHolder.checkbox1 = (CheckBox) view.findViewById(R.id.checkbox1);
        viewHolder.checkbox
                .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                    @Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

Model element = (Model)viewHolder.checkbox.getTag();
    String posit=element.getName();
Log.d(posit,"identifyme");
element.setSelected(buttonView.isChecked());
                        int dam=viewHolder.checkbox.getId();
                        //Log.d(dam,"bbb");
                        System.out.println("Checked : " + viewHolder.checkbox.getId());

                    }
                });
        viewHolder.checkbox1
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

Model element = (Model) viewHolder.checkbox1.getTag();

    String posit=element.getName();

                Log.d(posit,"identify");
                element.setSelected(buttonView.isChecked());



                //Log.d(tag,"identifyme");
            }
        });

        view.setTag(viewHolder);
        Log.d(tag,"me");
        viewHolder.checkbox.setTag(list.get(position));
        viewHolder.checkbox1.setTag(list.get(position));
    } else {
        view = convertView;
        Log.d(tag,"meeee");
        ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
        ((ViewHolder) view.getTag()).checkbox1.setTag(list.get(position));
    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.text.setText(list.get(position).getName());
    //String Dis=list.get(position).getName();
    //Log.d(Dis," event7");
    holder.checkbox.setChecked(list.get(position).isSelected());
    holder.checkbox1.setChecked(list.get(position).isSelected());
    Log.d(tag," event7");

    return view;

}
}

public class Model {
String tag = "Events";
private String name;
private boolean selected;

public Model(String name) {
    this.name = name;
    selected = false;
    Log.d(tag," ev");
}

public String getName() {
    Log.d(tag," eve");
    return name;
}

public void setName(String name) {
    Log.d(tag," nt");
    this.name = name;
}

public boolean isSelected() {
    Log.d(tag," t");
    return selected;
}

public void setSelected(boolean selected) {
    Log.d(tag," eventer");
    this.selected = selected;
}

}
mViewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.checkBox1);
            mViewHolder.checkBox.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    CheckBox cb = (CheckBox) v.findViewById(R.id.checkBox1);
                    if (cb.isChecked()) {
                        checkBoxArrayList.set(position, true);
                    } else if (!cb.isChecked()) {
                        checkBoxArrayList.set(position, false);
                    }
                }
            });

Hi below link may help for you http://mylearnandroid.blogspot.in/2014/06/listview-problem-while-scrolling.html 您好,下面的链接可能会对您有所帮助http://mylearnandroid.blogspot.in/2014/06/listview-problem-while-scrolling.html

This link also has the same problem and it is resolved in the following link. 此链接也有相同的问题,下面的链接中已解决。

Storing the state of checkbox in listview while using custom BaseAdapter in android? 在Android中使用自定义BaseAdapter时在listview中存储复选框的状态?

Hope it helps 希望能帮助到你

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM