ExpandableList просмотреть, как раздуть данные из «Карты» " - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь раздуть данные из «Map<ArrayList<String>, Object>», где я сохранил Заголовок как ArrayList<String> и дочерний список как Object. Проблема в том, что он дает сбой, когда я запускаю код.

Вот моя консоль отладки:

E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!
E/AndroidRuntime: Error reporting crash
android.os.TransactionTooLargeException
    at android.os.BinderProxy.transactNative(Native Method)
    at android.os.BinderProxy.transact(Binder.java:496)
    at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4164)
    at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:89)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

ОШИБКА:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.chonang.chonangclientlogin, PID: 12175
java.lang.StackOverflowError: stack size 8MB
    at com.chonang.chonangclientlogin.listViewAdapter.TestExpandableView.getGroupId(TestExpandableView.java:65)

Ошибка отображается на строка 65

Вот мой код адаптера:

 public TestExpandableView(String allow, Map<ArrayList<String>, Object> headerListArrayList, String country, String state, String city, String tree, Context context) {
    this.allow=allow;
    this.country=country;
    this.state=state;
    this.city=city;
    this.TREE=tree;
    this.data=headerListArrayList;
    this.context= context;
}

@Override
public int getGroupCount() {
    return data.size();
}

@Override
public int getChildrenCount(int groupPosition) {
    return (int) data.get(getChildrenCount(groupPosition));
}

@Override
public Object getGroup(int groupPosition) {
    return groupPosition;
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    return data.get(getChild(groupPosition,childPosition));         // THE ERROR IS INDICATION HERE
}

@Override
public long getGroupId(int groupPosition) {
    return (long) data.get(getGroupId(groupPosition));
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    String headerTitle = (String) data.get(getGroup(groupPosition));
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.expandable_view_header, null);
    }

    ExpandableListView mExpandableListView = (ExpandableListView) parent;
    mExpandableListView.expandGroup(groupPosition,isExpanded);


    TextView headerName = convertView.findViewById(R.id.headerName);
    headerName.setText(headerTitle);
    return convertView;
}

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

    initializedData(convertView);
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.card_view, null);
    }

    ItemListProduct data;

    data= (ItemListProduct) getChild(groupPosition,childPosition);

    itemName.setText(String.valueOf(data.getITEM_NAME()));

    return convertView;

}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return false;
}

private void initializedData(View convertView) {

    itemView= convertView.findViewById(R.id.itemView);
    itemName = convertView.findViewById(R.id.ListViewItemNameAdapter);
 }
}

1 Ответ

1 голос
/ 20 июля 2020

Я сделал полную выборку, которая помогает пользователю найти доступный отель из единого списка данных (ArrayList >). Попробуйте, он не решает вашу проблему напрямую, но содержит что-то полезное.

MainActivity. java:

public class MainActivity extends AppCompatActivity {

ArrayList<HashMap<String, String>> dataList;
CustomExpandableListViewAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ArrayList<String> header = new ArrayList<>();
    header.add("Country");
    header.add("State");
    header.add("City");
    header.add("Hotel");

    dataList = createSampleDataList(header);
    debugSampleDataList(header, dataList);

    ExpandableListView expandableListView = findViewById(R.id.eLV);
    adapter = new CustomExpandableListViewAdapter(this, header, dataList);
    expandableListView.setAdapter(adapter);
    expandableListView.expandGroup(0);
    expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
            return true;
        }
    });
    expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
            for (int j = adapter.getGroupCount() - 1; j > i; j--)
                expandableListView.collapseGroup(j);
            adapter.updateViewsOnClick(i, i1);
            if (i < adapter.getGroupCount() - 1) expandableListView.expandGroup(i + 1);
            else {
                int index = adapter.getFinalSelectedItemIndex(i1);
                Toast.makeText(getApplicationContext(), "(" + index + ")\n" +
                        dataList.get(index).toString(), Toast.LENGTH_LONG).show();
            }
            return true;
        }
    });
}

private ArrayList<HashMap<String, String>> createSampleDataList(ArrayList<String> header) {
    ArrayList<HashMap<String, String>> dataList = new ArrayList<>();
    for (int i = 0; i < 27; i++) {
        HashMap<String, String> data = new HashMap<>();
        data.put(header.get(0), header.get(0) + (i % 5 + 1));
        data.put(header.get(1), (i % 5 + 1) + header.get(1) + (i % 4 + 1));
        data.put(header.get(2), (i % 5 + 1) + header.get(2) + (i % 3 + 1));
        data.put(header.get(3), (i % 5 + 1) + header.get(3) + (i % 2 + 1));
        // If more items in header, add data fields here accordingly.
        dataList.add(data);
    }
    return dataList;
}

// Printing the whole data list to Logcat for debug.
private void debugSampleDataList(ArrayList<String> header, ArrayList<HashMap<String, String>> dataList) {
    String msg = "\n";
    for (HashMap<String, String> data : dataList) {
        for (String heading : header) {
            msg += data.get(heading) + " ";
        }
        msg += "\n";
    }
    Log.d("debug", msg);
}

}

CustomExpandableListViewAdapter. java:

public class CustomExpandableListViewAdapter extends BaseExpandableListAdapter {

Activity context;
ArrayList<String> groupList;
ArrayList<HashMap<String, String>> childList;

ArrayList<ArrayList<ArrayList<HashMap<String, String>>>> childListInViewArray = new ArrayList<>();
int[] selectedPositions;
LayoutInflater inflater;

public CustomExpandableListViewAdapter(Activity context, ArrayList<String> groupList, ArrayList<HashMap<String, String>> childList) {
    this.context = context;
    this.groupList = groupList;
    this.childList = childList;
    inflater = this.context.getLayoutInflater();

    selectedPositions = new int[groupList.size()];
    for (int i = 0; i < selectedPositions.length; i++) selectedPositions[i] = -1;

    ArrayList<HashMap<String, String>> singleChild;
    ArrayList<ArrayList<HashMap<String, String>>> childListInView = new ArrayList<>();
    for (HashMap<String, String> rawData : childList) {
        boolean found = false;
        int foundPosition = -1;
        if (childListInView.size() > 0) {
            for (foundPosition = 0; foundPosition < childListInView.size(); foundPosition++) {
                if (childListInView.get(foundPosition).get(0).get(groupList.get(0)).equals(rawData.get(groupList.get(0)))) {
                    singleChild = childListInView.get(foundPosition);
                    singleChild.add(rawData);
                    found = true;
                    break;
                }
            }
            if (!found) {
                singleChild = new ArrayList<>();
                singleChild.add(rawData);
                childListInView.add(singleChild);
            }
        } else {
            singleChild = new ArrayList<>();
            singleChild.add(rawData);
            childListInView.add(singleChild);
        }
    }
    childListInViewArray.add(childListInView);
}

@Override
public int getGroupCount() {
    return groupList.size();
}

@Override
public int getChildrenCount(int i) {
    return childListInViewArray.get(i).size();
}

@Override
public String getGroup(int i) {
    return groupList.get(i);
}

@Override
public ArrayList<HashMap<String, String>> getChild(int i, int i1) {
    return childListInViewArray.get(i).get(i1);
}

@Override
public long getGroupId(int i) {
    return 0;
}

@Override
public long getChildId(int i, int i1) {
    return 0;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
    if (view == null) {
        view = inflater.inflate(R.layout.item_group, null);
    }

    TextView tv = view.findViewById(R.id.group);
    tv.setText(getGroup(i));

    return view;
}

@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
    if (view == null) {
        view = inflater.inflate(R.layout.item_child, null);
    }

    TextView tv = view.findViewById(R.id.child);
    ArrayList<HashMap<String, String>> child = getChild(i, i1);
    tv.setText(child.get(0).get(groupList.get(i)) + " (" + childListInViewArray.get(i).get(i1).size() + ")");

    if (selectedPositions[i] == i1) tv.setTextColor(Color.RED);
    else tv.setTextColor(Color.BLACK);

    return view;
}

@Override
public boolean isChildSelectable(int i, int i1) {
    return true;
}

public void updateViewsOnClick(int group, int child) {
    for (int i = group; i < selectedPositions.length; i++) selectedPositions[i] = -1;
    selectedPositions[group] = child;
    for (int i = childListInViewArray.size() - 1; i > group; i--)
        childListInViewArray.remove(i);

    if (group == groupList.size() - 1) {
        notifyDataSetChanged();
    } else {
        updateNextGroup(group, child);
    }
}

private void updateNextGroup(int group, int child) {
    ArrayList<HashMap<String, String>> singleChild;
    ArrayList<ArrayList<HashMap<String, String>>> childListInView = new ArrayList<>();
    for (HashMap<String, String> rawData : childListInViewArray.get(group).get(child)) {
        boolean found = false;
        int foundPosition = -1;
        if (childListInView.size() > 0) {
            for (foundPosition = 0; foundPosition < childListInView.size(); foundPosition++) {
                if (childListInView.get(foundPosition).get(0).get(groupList.get(group + 1)).equals(rawData.get(groupList.get(group + 1)))) {
                    singleChild = childListInView.get(foundPosition);
                    singleChild.add(rawData);
                    found = true;
                    break;
                }
            }
            if (!found) {
                singleChild = new ArrayList<>();
                singleChild.add(rawData);
                childListInView.add(singleChild);
            }
        } else {
            singleChild = new ArrayList<>();
            singleChild.add(rawData);
            childListInView.add(singleChild);
        }
    }
    childListInViewArray.add(group + 1, childListInView);
    notifyDataSetChanged();
}

public int getFinalSelectedItemIndex(int child) {
    HashMap<String, String> selectedData = childListInViewArray.get(groupList.size() - 1).get(child).get(0);
    return childList.indexOf(selectedData);
}

}

activity_main. xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<ExpandableListView
    android:id="@+id/eLV"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</LinearLayout>

item_group. xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
    android:id="@+id/group"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="30dp"
    android:textSize="30sp"/>

</LinearLayout>

item_child. xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
    android:id="@+id/child"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="40dp"
    android:textSize="20sp"/>

</LinearLayout>
...