I'm trying to create a listview with each row having a checkbox and edittext. I've made edittext enabled on checkbox checked event by using notifyDatasetChanged().
But it resets position which makes it difficult to track current position. I've created an instance variable to keep track of current position on checkbox checked event, but that too resets to the last item checked.
The checkbox works fine. It enables edittext when checked and disables on uncheck, also checked status is fine. But the problem is edittext only getting last checked value if I use listposition, and last item if I use position.
My adapter is given below:
public class ListViewAdapter extends ArrayAdapter<Model> implements TextWatcher{
private final List<Model> list;
private final Context context;
private int listPosition;
private ViewHolder newHolder = null;
public ListViewAdapter(Context context, List<Model> list) {
super(context, R.layout.row, list);
this.context = context;
this.list = list;
}
public static class ViewHolder {
public CheckBox mCheckBox;
public EditText mEditText;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflator = LayoutInflater.from(context);
convertView = inflator.inflate(R.layout.row, null);
newHolder = new ViewHolder();
newHolder.mCheckBox = (CheckBox) convertView.findViewById(R.id.checkbox);
newHolder.mEditText = (EditText) convertView.findViewById(R.id.txtValue);
newHolder.mCheckBox.setText(list.get(position).getCheckText());
newHolder.mEditText.setText(list.get(position).getValue());
setEdit(false);
convertView.setTag(newHolder);
convertView.setTag(R.id.checkbox, newHolder.mCheckBox);
convertView.setTag(R.id.txtValue, newHolder.mEditText);
} else {
newHolder = (ViewHolder) convertView.getTag();
}
newHolder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
int getPosition = (int) compoundButton.getTag();
list.get(getPosition).setSelected(compoundButton.isChecked());
list.get(getPosition).setEnabled(compoundButton.isChecked());
setEdit(compoundButton.isChecked());
listPosition = getPosition;
if(!compoundButton.isChecked()){
list.get(getPosition).setValue("");
}
notifyDataSetChanged();
}
});
newHolder.mCheckBox.setTag(position);
newHolder.mEditText.setTag(position);
newHolder.mEditText.addTextChangedListener(this);
setEdit(list.get(position).isEnabled());
return convertView;
}
public void setEdit(boolean bool){
newHolder.mEditText.setEnabled(bool);
newHolder.mEditText.setFocusableInTouchMode(bool);
newHolder.mEditText.setCursorVisible(bool);
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void afterTextChanged(Editable s) {
list.get(listPosition).setValue(s.toString());
}
}