向下滚动时,Listview复选框变为未选中状态

时间:2016-12-06 10:51:23

标签: android listview checkbox

我创建了一个自定义列表视图,其中包含一个复选框和两行文本。我想在单击列表项时更改复选框状态(这意味着如果单击列表项的任何部分复选框或文本,复选框将更改状态)。 为此,我在custom_list_row xml文件中添加了这个:

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants" >

<CheckBox
    android:id="@+id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:clickable="false" />

在java类中我做了这些:

    listview.setAdapter(adapter);

    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final CheckBox checkBox;
            checkBox = (CheckBox)view.findViewById(R.id.checkbox);


            if(checkBox.isChecked()){
                checkBox.setChecked(false);
            }
            else {
                checkBox.setChecked(true);
            }
        }
    });

这很好用。但唯一的问题是,当我选择一些项目并向下滚动时 - &gt;返回所选项目 - &gt;所选项目将被取消选中。

我没有对setOnCheckedChangeListener

做任何事情

出了什么问题?任何解决这个问题的建议都会有所帮助。

由于

2 个答案:

答案 0 :(得分:0)

我建议你需要使用recyclerview

public class CardViewActivity extends AppCompatActivity {

 private Toolbar toolbar;

 private RecyclerView mRecyclerView;
 private RecyclerView.Adapter mAdapter;
 private RecyclerView.LayoutManager mLayoutManager;

 private List<Student> studentList;

 private Button btnSelection;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  toolbar = (Toolbar) findViewById(R.id.toolbar);
  btnSelection = (Button) findViewById(R.id.btnShow);

  studentList = new ArrayList<Student>();

  for (int i = 1; i <= 15; i++) {
   Student st = new Student("Student " + i, "androidstudent" + i
     + "@gmail.com", false);

   studentList.add(st);
  }

  if (toolbar != null) {
   setSupportActionBar(toolbar);
   getSupportActionBar().setTitle("Android Students");

  }

  mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

  // use this setting to improve performance if you know that changes
  // in content do not change the layout size of the RecyclerView
  mRecyclerView.setHasFixedSize(true);

  // use a linear layout manager
  mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

  // create an Object for Adapter
  mAdapter = new CardViewDataAdapter(studentList);

  // set the adapter object to the Recyclerview
  mRecyclerView.setAdapter(mAdapter);

  btnSelection.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    String data = "";
    List<Student> stList = ((CardViewDataAdapter) mAdapter)
      .getStudentist();

    for (int i = 0; i < stList.size(); i++) {
     Student singleStudent = stList.get(i);
     if (singleStudent.isSelected() == true) {

      data = data + "\n" + singleStudent.getName().toString();
      /*
       * Toast.makeText( CardViewActivity.this, " " +
       * singleStudent.getName() + " " +
       * singleStudent.getEmailId() + " " +
       * singleStudent.isSelected(),
       * Toast.LENGTH_SHORT).show();
       */
     }

    }

    Toast.makeText(CardViewActivity.this,
      "Selected Students: \n" + data, Toast.LENGTH_LONG)
      .show();
   }
  });

 }

}

有关详情,请参阅http://android-pratap.blogspot.in/2015/01/recyclerview-with-checkbox-example.html

如果你想使用listview试试这种方式

public class CustomAdapter extends BaseAdapter {
    private final LayoutInflater inflater;
    private final Context context;
    private List<Modelclass> listData;

    public CustomAdapter(Context mainActivity, List<Modelclass> listData) {
        context = mainActivity;
        this.listData = listData;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

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

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.list_item_poojaselection, null);
            holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname);
            holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.checks.setOnCheckedChangeListener(null);
        holder.checks.setFocusable(false);

        if (listData.get(position).isselected) {
            holder.checks.setChecked(true);
        } else {
            holder.checks.setChecked(false);
        }

        holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton cb, boolean b) {

                if (checkMaxLimit()) {

                    if (listData.get(position).isselected && b) {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;

                    } else {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;
                        Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    if (b) {
                        listData.get(position).isselected = true;
                    } else {
                        listData.get(position).isselected = false;
                    }
                }
            }
        });

        holder.tv.setText(listData.get(position).getLISTING_NAME());
        return convertView;
    }

    public boolean checkMaxLimit() {
        int countermax = 0;
        for(Modelclass item : listData){
            if(item.isselected){
                countermax++;
            }
        }
        return countermax >= 5;
    }

    public class ViewHolder {
        TextView tv;
        public CheckBox checks;
    }
}

答案 1 :(得分:0)

请在选中/取消选中复选框时进行更改

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final CheckBox checkBox;
            checkBox = (CheckBox)view.findViewById(R.id.checkbox);


            if(checkBox.isChecked()){
                checkBox.setChecked(false);

                    // Reset the checkbox in array list/Bean  like 

                    list.set(); // set new value of list 

                    adapter.notifyChange();

            }
            else {
                checkBox.setChecked(true);

                 // Reset the checkbox in array list/Bean  like 

                    list.set(); // set new value of list 

                    adapter.notifyChange();
            }
        }
    });

这一改变解决了我的这个问题。