Я сделал полную выборку, которая помогает пользователю найти доступный отель из единого списка данных (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>