Android — ExpandableListView с пользовательским ExpandableListAdapter с кнопкой «Удалить» внутри дочерних строк

Я попробовал 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);
        }
    }
}

Есть ли ошибка в моем коде? Или в моем коде отсутствует какой-либо раздел?

Пожалуйста, помогите мне решить эту проблему.


person Eddy Christian    schedule 04.02.2016    source источник


Ответы (1)


Вот что я делаю в своем ExpandableListAdapter, который помогает:

public class ExpandableListAdapter extends BaseExpandableListAdapter {

private Context _context;
private List<String> _listDataHeader; 
private HashMap<String, List<String>> _listDataChild;

public ExpandableListAdapter(Context context, List<String> listDataHeader,
                             HashMap<String, List<String>> listChildData) {
    this._context = context;
    this._listDataHeader = listDataHeader;
    this._listDataChild = listChildData;
}

@Override
public View getChildView(final int groupPosition, final int childPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {

    final String childText = (String) getChild(groupPosition, childPosition);

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_item, null);
    }

    TextView txtListChild = (TextView) convertView
            .findViewById(R.id.lblListItem);

    txtListChild.setText(childText);

    Button delete = (Button) convertView.findViewById(R.id.remove_item_button);
    delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            _listDataChild.get(_listDataHeader.get(groupPosition)).remove(childPosition);
            ExpandableListAdapter.this.notifyDataSetChanged();
        }
    });

    return convertView;
}

}

person Federico Contreras    schedule 02.04.2016