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());
}
}