简体   繁体   中英

android checkbox is not checked for custom listview when listview is in scrollview

i have implemented custom list view with check box and textviews. It is working fine when list view is not in scroll but if the rows are increased then listviews is in scroll view that time when i click on check box the checked mark is not staying. here is my code, Please suggest me if anything wrong in that code

public class ArchivedAdapter extends ArrayAdapter<MessageBean> {
final ArrayList<MessageBean> updatedList = new ArrayList<MessageBean>();
private List<MessageBean> list;
private TextView officenameView, sentOnView, messageView;
public final static String MY_ACTION = "com.android.threeptalk.broadcast";
private boolean isDeleted = false;
int count = 0;
HashMap<Integer, CheckBox> checkList = new HashMap<Integer, CheckBox>();

public ArchivedAdapter(Context context, int resourseID,
        List<MessageBean> list) {
    super(context, resourseID, list);
    this.list = list;

}

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

@Override
public MessageBean getItem(int arg0) {
    return list.get(arg0);
}

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

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

    View row = convertView;
    LayoutInflater inflater = (LayoutInflater) this.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    row = inflater.inflate(R.layout.archievedmsgrow, parent, false);
    row.setId(position);
    Object obj = getItem(position);
    if (obj instanceof MessageBean) {
        final MessageBean message = (MessageBean) obj;
        CheckBox checkBox = (CheckBox) row.findViewById(R.id.checkBox);
        officenameView = (TextView) row.findViewById(R.id.officename);
        sentOnView = (TextView) row.findViewById(R.id.time);
        messageView = (TextView) row.findViewById(R.id.message);
        officenameView.setText(message.getOfficeName());
        checkList.put(position, checkBox);
        checkBox.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                CheckBox c = (CheckBox) v;
                if (c.isChecked()) {
                    c.setChecked(true);
                    count++;
                    updatedList.add(message);


                } else {
                    c.setChecked(false);
                    count--;
                    updatedList.remove(message);
                    updatedList.size());
                }
                checkedCount(count, updatedList);
            }
        });

        row.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                rowclicked(message, position);

            }
        });
        sentOnView.setText(Common.getAppropriateTimeUsingTimeZone(message
                .getmDate()));
        if (message.getMessage() != null) {

            messageView.setText((message.getMessage()));

        } else {
            if (message.getMessageType().equals("OPTION")) {
                if (message.getOptions() != null
                        && message.getOptions().size() > 0) {
                    String data = message.getOptions().get(0);
                    if (data != null && !data.equals("")) {

                        messageView.setText(data);
                    }
                }
            }
        }

    }
    return row;
}

protected void messageSelected() {

}


protected void rowclicked(MessageBean message, int position) {
    // TODO Auto-generated method stub

}

protected void checkedCount(int count2, ArrayList<MessageBean> updatedList) {

}
}

`

Seems like you are checking the check status of checkbox inside its onClickListener() .

First define an Hashmap or SparseBooleanArray to save your selections.

private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>();

Then add the following code to your getView() method.

 CheckBox checkBox = (CheckBox) row.findViewById(R.id.checkBox);
    checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            mSelection.put(position, isChecked);
        }
    });

    if (mSelection.get(position) != null) {
        if (mSelection.get(position))
            checkBox.setChecked(true);
        else
            checkBox.setChecked(false);
    }

Try this, Assuming that you are using the Custom Adapter for your ListView, you will be able to set Tag for each Item inside your Adapter's getView(),

    public View getView(int position, View convertView, ViewGroup parent) {
    EvenViewHolder holdereven;
        if (convertView == null) {
            convertView = mInfaltor.inflate(R.layout.schedule_adapter_view,
                    null);
            holdereven = new EvenViewHolder();
            holdereven.time = (TextView) convertView
                    .findViewById(R.id.time);
            holdereven.title = (TextView) convertView
                    .findViewById(R.id.title);
            holdereven.des = (TextView) convertView.findViewById(R.id.des);
            convertView.setTag(holdereven);

        } else {
            holdereven = (EvenViewHolder) convertView.getTag();
        }

 static class EvenViewHolder {
    TextView time, title, des;

}
  }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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