Я попробовал ExpandableListView с настраиваемым адаптером, с кнопкой «Добавить» в каждой строке группы, которая может добавить дочернюю строку под ней одним нажатием кнопки «Добавить». в каждой дочерней строке есть два ввода простого текста с кнопкой удаления для удаления строки, которую разместила кнопка удаления. Но после того, как я создаю код для удаления строки, у меня возникает проблема с удаленными данными.
Вот это отображение после того, как я заполнил ввод простого текста и до того, как я нажму второй значок удаления кнопка (красный кружок).
Вот это дисплей после того, как я нажму второй кнопка удалить в предыдущей ссылке. На этом рисунке показано, что удаленная дочерняя строка не является второй, а удаленная является последней (я проверил список массивов внутри моего пользовательского значения адаптера, и удаленное значение верно). Даже если я нажму на другой, кроме последнего, удаленная строка всегда будет последней.
Вот мои коды для пользовательского класса адаптера:
package com.orderpakan.japfa.androiddynamicwidget;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import java.util.ArrayList;
public class CustomExpandListAdapter extends BaseExpandableListAdapter {
private static Context mycontext;
private ArrayList<Truk> trukList;
private OnItemSelectedListener onItemSelectedCallback;
public interface OnItemSelectedListener {
public void onButtonAddClick(int groupPosition);
public void onButtonDeleteClick(int groupPosition, int childPosition);
}
public CustomExpandListAdapter(Context c){
mycontext = c;
trukList = new ArrayList<Truk>();
trukList.add(new Truk("Aaaaaa", "This is the remarks for Aaaaaa"));
trukList.add(new Truk("Bbbbbb", "This is the remarks for Bbbbbb"));
trukList.add(new Truk("Cccccc", "This is the remarks for Cccccc"));
trukList.add(new Truk("Dddddd", "This is the remarks for Dddddd"));
trukList.add(new Truk("Eeeeee", "This is the remarks for Eeeeee"));
try {
this.onItemSelectedCallback = (OnItemSelectedListener) mycontext;
}
catch (ClassCastException e) {
throw new ClassCastException(mycontext.toString() + " must implement OnItemSelectedListener ");
}
}
@Override
public int getGroupCount() {
return trukList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return trukList.get(groupPosition).getPakanList().size();
}
@Override
public Truk getGroup(int groupPosition) {
return trukList.get(groupPosition);
}
@Override
public Pakan getChild(int groupPosition, int childPosition) {
return trukList.get(groupPosition).getPakanList().get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View vi = convertView;
if (vi == null) {
LayoutInflater inflater = (LayoutInflater) mycontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater.inflate(R.layout.list_header, parent, false);
}
TextView txtNamaTruk = (TextView) vi.findViewById(R.id.txtNamaTruk);
TextView txtDetailTruk = (TextView) vi.findViewById(R.id.txtDetailTruk);
ImageButton imageAdd = (ImageButton) vi.findViewById(R.id.imageAdd);
Truk tempTruk = trukList.get(groupPosition);
txtNamaTruk.setText(tempTruk.getNama());
txtDetailTruk.setText(tempTruk.getDesc());
imageAdd.setImageResource(android.R.drawable.ic_input_add);
imageAdd.setScaleType(ImageButton.ScaleType.FIT_CENTER);
imageAdd.setFocusable(false);
imageAdd.setClickable(true);
imageAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
trukList.get(groupPosition).getPakanList().add(new Pakan());
CustomExpandListAdapter.this.notifyDataSetChanged();
onItemSelectedCallback.onButtonAddClick(groupPosition);
}
});
return vi;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View vi = convertView;
if (vi == null) {
LayoutInflater inflater = (LayoutInflater) mycontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater.inflate(R.layout.list_detail, parent, false);
}
EditText editPakan = (EditText) vi.findViewById(R.id.editPakan);
editPakan.setClickable(true);
EditText editSak = (EditText) vi.findViewById(R.id.editSak);
editSak.setClickable(true);
ImageButton imageDelete = (ImageButton) vi.findViewById(R.id.imageDelete);
imageDelete.setImageResource(android.R.drawable.ic_input_delete);
imageDelete.setScaleType(ImageButton.ScaleType.FIT_CENTER);
imageDelete.setFocusable(false);
imageDelete.setClickable(true);
trukList.get(groupPosition).getPakanList().get(childPosition).setTxtNama(editPakan);
trukList.get(groupPosition).getPakanList().get(childPosition).setTxtJmlhSak(editSak);
imageDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
trukList.get(groupPosition).getPakanList().remove(childPosition);
CustomExpandListAdapter.this.notifyDataSetChanged();
onItemSelectedCallback.onButtonDeleteClick(groupPosition, childPosition);
}
});
return vi;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
А вот код действия для вызова ExpandableListView:
package com.orderpakan.japfa.androiddynamicwidget;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.Toast;
public class ListDropDownActivity extends AppCompatActivity implements CustomExpandListAdapter.OnItemSelectedListener {
private ExpandableListView expand1;
private CustomExpandListAdapter adapter;
private Button btnView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_drop_down);
expand1 = (ExpandableListView) findViewById(R.id.expand1);
adapter = new CustomExpandListAdapter(this);
expand1.setAdapter(adapter);
btnView = (Button) findViewById(R.id.btnView);
btnView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String teks = "";
for (int i = 0; i < adapter.getGroupCount(); i++) {
Truk tempTruk = (Truk) adapter.getGroup(i);
teks += "Truk: " + tempTruk.getNama() + " (" + tempTruk.getDesc() + ")\n";
for (int j = 0; j < adapter.getChildrenCount(i); j++) {
teks += "- Pakan: " + adapter.getChild(i,j).getTxtNama().getText().toString() + " (" + adapter.getChild(i,j).getTxtJmlhSak().getText().toString() + " sak)\n";
}
teks += "\n";
}
Toast.makeText(ListDropDownActivity.this, teks, Toast.LENGTH_LONG).show();
}
});
}
@Override
public void onButtonAddClick(int groupPosition) {
expand1.expandGroup(groupPosition);
}
@Override
public void onButtonDeleteClick(int groupPosition, int childPosition) {
if(adapter.getChildrenCount(groupPosition)==0) {
expand1.collapseGroup(groupPosition);
}
}
}
Есть ли ошибка в моем коде? Или в моем коде отсутствует какой-либо раздел?
Пожалуйста, помогите мне решить эту проблему.