Не знаю, почему, если я нажимаю кнопку удаления, содержащуюся в строке списка, всегда удаляет последний элемент. Тост-msg в функции удаления onClick (deleteTag) отображает правильный элемент для удаления , Также удаленные строки не являются постоянными - если я поворачиваю устройство, список снова заполняется. Я действительно не знаю, что я делаю неправильно.Кнопка удаления в customAdapter всегда удаляет последний элемент
tagList (активность)
public class tagList extends AppCompatActivity {
MyCustomAdapter myCustomAdapter;
ListView tagLv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tag_list);
//Generate list View from ArrayList
displayListView();
}
private void displayListView() {
//Array list of tags, Tag(id,name,checked)
ArrayList<Tag> TagList = new ArrayList<Tag>();
TagList.add(new Tag(1, "aaa", false));
TagList.add(new Tag(2, "bbb", false));
TagList.add(new Tag(3, "ccc", false));
//my adapter for listview
myCustomAdapter = new MyCustomAdapter(tagList.this,R.layout.activity_tag_list,TagList);
tagLv = (ListView) findViewById(R.id.tagLv);
tagLv.setAdapter(myCustomAdapter);
}
// onClick
public void deleteTag(View view){
Tag itemToRemove = (Tag) view.getTag(R.string.tagListTag); //tagListTag= 1
myCustomAdapter.remove(itemToRemove);
myCustomAdapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(),"item removed: " +itemToRemove.getName(),Toast.LENGTH_SHORT).show();
}
}
MyCustomAdapter
public class MyCustomAdapter extends ArrayAdapter<Tag>{
private ArrayList<Tag> tagList;
private LayoutInflater layoutInflater;
private Context context;
public MyCustomAdapter(Context context, int resource, List<Tag> objects) {
super(context, resource, objects);
this.layoutInflater = LayoutInflater.from(context);
this.tagList = new ArrayList<Tag>();
this.tagList.addAll(objects);
this.context = context;
}
private class ViewHolder {
TextView textName;
CheckBox cbName;
Button rmBtn;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.row_tag_item, null);
holder = new ViewHolder();
holder.textName = (TextView) convertView.findViewById(R.id.textName);
holder.cbName = (CheckBox) convertView.findViewById(R.id.cbName);
holder.rmBtn = (Button) convertView.findViewById(R.id.removeTagBtn);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
Tag myTag = tagList.get(position);
holder.textName.setText(" #" + myTag.getId());
holder.cbName.setText(myTag.getName());
holder.cbName.setChecked(myTag.getSelected());
holder.rmBtn.setTag(R.string.id, myTag.getId()); // id for future delete from DB
holder.rmBtn.setTag(R.string.tagListTag, myTag);
return convertView;
}
}
спасибо, это была проблема, также я замечаю, что MyCustomAdapter constroctor должен иметь 'ArrayList объектов' вместо' List объектов' param. Есть ли разница в использовании 'TagList.remove (itemToRemove)' вместо 'myCustomAdapter.remove (itemToRemove)' - обе работают одинаково? –
moo69
Поскольку есть ссылка на список. Теперь это не имеет значения. Вы можете использовать любой из них. –