如何在Android Studio中的Expandablelistview的子布局中使用Listview



我想在ExpandableListview的子布局中获取Listview,该子布局将从JSON文件中获取数据。我正在提供必要的代码来检查您。你能帮我怎么做吗?

{"park":[
{
"serialno":"১ । ",
"parkname":"রোজ গার্ডেন",
"parkimage":"park_dhaka_rose_garden",
"description":"বর্তমান নাম রশিদ মঞ্জিল । সুদৃশ্য নারী মূর্তি, আয়তাকার পুকুর, রশিদ মঞ্জিল, ফোয়ারা, সাত ধাপ বিশিষ্ট সিঁড়ি, উপবৃত্তাকার উদগত অপ্রশস্ত বেলকনি, আধাগোলাকার গম্ভুজ, ছত্রী নকশা, ঘুর্ণায়মান সিঁড়ি, রঙ্গিন কাঁচের অলঙ্করণ ইত্যাদি ।",
"location":"ঢাকা সূত্রাপুর থানা এলাকাধীন ১৩ নং কে.এ. দাস লেন।",
"timing":" প্রতিদিন সকাল ৯ টা থেকে সন্ধ্যা ৬ টা পর্যন্ত। রোজ গার্ডেনের কোন সাপ্তাহিক বন্ধ নেই। তবে শুটিং চলাকালীন সময়ে দর্শনার্থীদের প্রবেশ করতে দেওয়া হয় না।"
},
{
"serialno":"২ । ",
"parkname":"ওসমানী উদ্যান",
"parkimage":"park_dhaka_osmani_uddan",
"description":"মীর জুমলার কামান, জলাধার, ওয়াক ওয়ে, মহিলা এ্যারেনা, শিশু এ্যারেনা, স্বাধীনতা স্মৃতি স্তম্ভ, বৃক্ষের সমাহরোহ, বালু দ্বীপ ইত্যাদি।n",
"location":"ঢাকার গুলিস্তানে ঢাকা সিটি কর্পোরেশনের (নগর ভবন) বিপরীত পাশে এবং সচিবালয়ের পিছনে।",
"timing":"গ্রীস্মকালে এটি সকাল ৫.০০ টা থেকে রাত ৯.০০ টা পর্যন্ত এবং শীতকালে সকাল ৬.০০ টা থেকে রাত ৮.০০ টা পর্যন্ত।"
},
{
"serialno":"৩ । ",
"parkname":"নন্দন পার্ক",
"parkimage":"park_dhaka_nandan_park",
"description":"আকর্ষনীয় রাইডগুলোর মধ্যে রয়েছে ক্যাবল কার, ওয়েব পুল, জিপ স্লাইড, রক ক্লাইমরিং, রিপলিং, মুন রেকার, কাটার পিলার, ওয়াটার কোস্টার, আইসল্যান্ড, প্যাডেল বোট প্রভৃতি। এছাড়া রয়েছে ওয়াটার ওয়ার্ল্ড ও ঘুরে বেড়ানোর অনেক জায়গা।",
"location":"সাভার-চন্দ্রা মহাসড়কের পাশে, সাভার।",
"timing":"প্রতিদিন সকাল ১০ টা থেকে সন্ধ্যা ৬ টা পর্যন্ত। শুক্রবার ও সকল বন্ধের দিনে সকাল ১০.০০ টা থেকে রাত ৯.০০ টা পর্যন্ত।"
}
]
}

Stings.xml

<resources>
<string name="app_name">Address Guide</string>
<string-array name="bd_division_list">
<item> ঢাকা বিভাগ </item>
<item> চট্টগ্রাম বিভাগ </item>
<item> রাজশাহী বিভাগ </item>
<item> খুলনা বিভাগ </item>
<item> বরিশাল বিভাগ </item>
<item> সিলেট বিভাগ </item>
<item> রংপুর বিভাগ </item>
<item> ময়মনসিংহ বিভাগ </item>
</string-array>
</resources>

可扩展列表自定义适配器.java

package com.stieschool.addressguide;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ExpandableListViewCustomAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> groupListHeader;
HashMap<String,ArrayList<HashMap<String,String>>> childList;
ListAdapter adapter;
public ExpandableListViewCustomAdapter(Context context, List<String> groupListHeader, HashMap<String, ArrayList<HashMap<String, String>>> childList, ListAdapter adapter) {
this.context = context;
this.groupListHeader = groupListHeader;
this.childList = childList;
this.adapter = adapter;
}
@Override
public int getGroupCount() {
return groupListHeader.size();
}
@Override
public int getChildrenCount(int i) {
return childList.get(groupListHeader.get(i)).size();
}
@Override
public Object getGroup(int i) {
return groupListHeader.get(i);
}
@Override
public Object getChild(int i, int i1) {
return childList.get(groupListHeader.get(i)).get(i1);
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i1) {
return i1;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
String groupText = (String) getGroup(i);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.park_item_group,null);
TextView header = view.findViewById(R.id.parkDivisionNameGroupTextViewId);
header.setText(groupText);
return view;
}
@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.park_item_child,null);
ListView parklistview = view.findViewById(R.id.parkItemListViewId);
parklistview.setAdapter(adapter);
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
}

ParkActivity.java

public class ParkActivity extends AppCompatActivity {
ExpandableListView expandableListView;
List<String> groupListHeader;
HashMap<String,ArrayList<HashMap<String,String>>> childList;
ListAdapter adapter;
ExpandableListViewCustomAdapter customExpandableAdapter;
ArrayList<HashMap<String,String>> listItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_park);
expandableListView = findViewById(R.id.parkExpandableListViewId);

try {
JSONObject jsonObject=new JSONObject(loadJsonFile());
JSONArray jsonArray=jsonObject.getJSONArray("park");
HashMap<String,String> listItem;
listItems=new ArrayList<>();
for(int i=0; i<jsonArray.length();i++)
{
JSONObject obj=jsonArray.getJSONObject(i);
String serialno=obj.getString("serialno");
String parkname=obj.getString("parkname");
String parkimagefilename=obj.getString("parkimage");
String parkimage = Integer.toString(getApplicationContext().getResources().getIdentifier(parkimagefilename, "drawable", getApplicationContext().getPackageName()));
String description=obj.getString("description");
String location=obj.getString("location");
String timing=obj.getString("timing");
listItem=new HashMap<>();
listItem.put("serialno",serialno);
listItem.put("parkname",parkname);
listItem.put("parkimage",parkimage);
listItem.put("description",description);
listItem.put("location",location);
listItem.put("timing",timing);
listItems.add(listItem);
}
adapter=new SimpleAdapter(this,listItems,R.layout.park_list_item_layout,
new String[]{"serialno","parkname","parkimage","description","location","timing"},
new int[]{R.id.parkSerialTextviewId,R.id.parkNameTextViewId,R.id.parkImageViewId,R.id.parkDescriptionId,R.id.parkLocationId,R.id.parkTimingId});

} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
prepareParkData();
customExpandableAdapter = new ExpandableListViewCustomAdapter(this,groupListHeader,childList,adapter);
expandableListView.setAdapter(customExpandableAdapter);
}
public String loadJsonFile() throws IOException {
String json=null;
InputStream inputStream=this.getAssets().open("park_dhaka.json");
int size=inputStream.available();
byte[] byteArray=new byte[size];
inputStream.read(byteArray);
inputStream.close();
json=new String(byteArray, "UTF-8");
return json;
}
public void prepareParkData()
{
String[] divisionList = getResources().getStringArray(R.array.bd_division_list);
groupListHeader = new ArrayList<>();
childList =new HashMap<>();
for(int i=0; i<divisionList.length; i++)
{
groupListHeader.add(divisionList[i]);
ArrayList<HashMap<String,String>> child = new ArrayList<>();
if(i == 0)
{
for(int j=0; j<listItems.size(); j++)
{
child.add(listItems.get(j));
}
}
childList.put(groupListHeader.get(i),child);
}
}
}

park_item_group.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:background="#6479ED"
android:id="@+id/parkDivisionNameGroupTextViewId"
android:layout_width="match_parent"
android:layout_height="40dp"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#ffff"
android:gravity="center"
android:layout_margin="5dp"/>
</LinearLayout>

park_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="match_parent">
<ListView
android:id="@+id/parkItemListViewId"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>

问题是:只有json文件的第一项重复,而不是json文件的所有项你能帮助我解决这个问题吗?

谨致问候,Tojib

选项1:在park_item_child.xml中,必须为listview设置自定义高度。包装或火柴在这里不起作用。

<ListView
android:id="@+id/parkItemListViewId"
android:layout_width="match_parent"
android:layout_height="400dp"
/>

选项2:添加android:nestedScrollingEnabled="真";列表视图中的属性如下,

<ListView
android:id="@+id/parkItemListViewId"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="true"/>

尝试以下操作:

1.在列表视图中添加android:nestedScrollingEnabled="true"属性。

2.在ExpandableListViewCustomAdapter中,getChildrenCount((如下所示:

@Override
public int getChildrenCount(int i) {
//return childList.get(groupListHeader.get(i)).size();
return 1;
}

最新更新