在 ExpandableListView 的底部添加按钮?
Add Button bottom of the ExpandableListView?
我正在制作一个应用程序,我在 Fragment Activity 中使用了这个 ExpandableListView。我想在 ListView 的底部添加按钮。我正在尝试,但是当我添加 Button 时,它无法正常工作,Button 被添加到每个列表 header。我的代码如下。
这是当前截图
我要这样
这是我的 xml:
<RelativeLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".TurbooneFragment"
android:background="@color/gray_50">
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:id="@+id/turboone_view">
</ExpandableListView>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="35dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"
android:id="@+id/turboone_item"
android:textColor="@android:color/black"/>
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/blue_500"
android:textSize="14sp"
android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
android:id="@+id/listturbooneheader"/>
</LinearLayout>
</RelativeLayout>
// 这是我的 java 代码:
public class TurbooneFragment extends Fragment {
private TurbooneListAdapter listadapter;
private ExpandableListView listView;
private List<String> listDataHeader;
private HashMap<String,List<String>> listHash;
public TurbooneFragment() {
// Required empty public constructor
}
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_turboone, container, false);
listView = view.findViewById(R.id.turboone_view);
initData();
listadapter = new TurbooneListAdapter(this.getContext(),listDataHeader,listHash);
listView.setAdapter(listadapter);
return view;
}
private void initData(){
listDataHeader = new ArrayList<>();
listHash = new HashMap<>();
listDataHeader.add("first");
listDataHeader.add("second");
listDataHeader.add("third");
List<String> first= new ArrayList<>();
first.add("blabla");
List<String> second= new ArrayList<>();
second.add("bla");
List<String> third= new ArrayList<>();
third.add("blabla");
third.add("blabla");
listHash.put(listDataHeader.get(0),first);
listHash.put(listDataHeader.get(1),second);
listHash.put(listDataHeader.get(2),third);
}
}
// 我的 ListViewAdapter:
public class TurbooneListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> listDataHeader;
private HashMap<String,List<String >> listHashMap;
public TurbooneListAdapter (Context context, List<String> listDataHeader, HashMap<String, List<String>> listHashMap){
this.context=context;
this.listDataHeader=listDataHeader;
this.listHashMap=listHashMap;
}
@Override
public int getGroupCount() {
return listDataHeader.size();
}
@Override
public int getChildrenCount(int i) {
return listHashMap.get(listDataHeader.get(i)).size();
}
@Override
public Object getGroup(int i) {
return listDataHeader.get(i);
}
@Override
public Object getChild(int i, int i1) {
return listHashMap.get(listDataHeader.get(i)).get(i1); // i= child item, i1= group item
}
@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 headerTitle = (String)getGroup(i);
if (view == null){
LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=inflater.inflate(R.layout.fragment_turboone,null);
}
TextView list1header = (TextView)view.findViewById(R.id.listturbooneheader);
list1header.setTypeface(null, Typeface.BOLD);
list1header.setText(headerTitle);
return view;
}
@SuppressLint("ResourceAsColor")
@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
final String childText = (String)getChild(i,i1);
if (view== null){
LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.fragment_turboone,null);
}
TextView txtListChild = (TextView) view.findViewById(R.id.turboone_item);
txtListChild.setTypeface(null, Typeface.NORMAL);
txtListChild.setText(childText);
return view;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
}
您对 ExpandableListView
以及每个组行和 child 行使用相同的 layout
(fragment_turboone)。您必须为 3 个组件中的每一个提供不同的布局。一种布局用于 fragment
,其中包含 ExpandableListView
,另一种用于您的组布局(headers),另一种用于您的 child 视图(组内的行)。
由于您对所有组件使用相同的布局,因此您在此布局中添加的任何 View
也会添加到列表、组和 child 中。这就是为什么您必须创建单独的布局。
片段
因此,您的片段布局应如下所示:
fragment_turboone.xml
<RelativeLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".TurbooneFragment"
android:background="@color/gray_50">
<Button
android:id="+@id/buttonId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="your text"/>
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:id="@+id/turboone_view"
android:layout_above="@id/buttonId">
</ExpandableListView>
</RelativeLayout>
群组视图
然后,您需要为您的组视图创建另一个布局(资源中 layout
文件夹内的 XML 文件):
group_layout.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/blue_500"
android:textSize="14sp"
android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
android:id="@+id/listturbooneheader"/>
</LinearLayout>
Child 查看
以及 child 视图的另一个布局:
child_layout.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"
android:id="@+id/turboone_item"
android:textColor="@android:color/black"/>
</LinearLayout>
最后,您必须正确地为每个布局充气。你的 TurbooneFragment
的 onCreateView()
是正确的,因为它膨胀 fragment_turboone
.
在您的适配器中,您必须更改为您的组膨胀的布局和 child。
在您的 TurbooneListAdapter
的 getGroupView()
中,您必须更改行:
view = inflater.inflate(R.layout.fragment_turboone, null);
为
view = inflater.inflate(R.layout.group_layout, null);
并且在 TurbooneListAdapter
的 getChildView()
中,您必须更改行:
view = inflater.inflate(R.layout.fragment_turboone, null);
为
view = inflater.inflate(R.layout.child_layout, null);
然后你应该让你的列表工作。
我正在制作一个应用程序,我在 Fragment Activity 中使用了这个 ExpandableListView。我想在 ListView 的底部添加按钮。我正在尝试,但是当我添加 Button 时,它无法正常工作,Button 被添加到每个列表 header。我的代码如下。
这是我的 xml:
<RelativeLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".TurbooneFragment"
android:background="@color/gray_50">
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:id="@+id/turboone_view">
</ExpandableListView>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="35dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"
android:id="@+id/turboone_item"
android:textColor="@android:color/black"/>
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/blue_500"
android:textSize="14sp"
android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
android:id="@+id/listturbooneheader"/>
</LinearLayout>
</RelativeLayout>
// 这是我的 java 代码:
public class TurbooneFragment extends Fragment {
private TurbooneListAdapter listadapter;
private ExpandableListView listView;
private List<String> listDataHeader;
private HashMap<String,List<String>> listHash;
public TurbooneFragment() {
// Required empty public constructor
}
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_turboone, container, false);
listView = view.findViewById(R.id.turboone_view);
initData();
listadapter = new TurbooneListAdapter(this.getContext(),listDataHeader,listHash);
listView.setAdapter(listadapter);
return view;
}
private void initData(){
listDataHeader = new ArrayList<>();
listHash = new HashMap<>();
listDataHeader.add("first");
listDataHeader.add("second");
listDataHeader.add("third");
List<String> first= new ArrayList<>();
first.add("blabla");
List<String> second= new ArrayList<>();
second.add("bla");
List<String> third= new ArrayList<>();
third.add("blabla");
third.add("blabla");
listHash.put(listDataHeader.get(0),first);
listHash.put(listDataHeader.get(1),second);
listHash.put(listDataHeader.get(2),third);
}
}
// 我的 ListViewAdapter:
public class TurbooneListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> listDataHeader;
private HashMap<String,List<String >> listHashMap;
public TurbooneListAdapter (Context context, List<String> listDataHeader, HashMap<String, List<String>> listHashMap){
this.context=context;
this.listDataHeader=listDataHeader;
this.listHashMap=listHashMap;
}
@Override
public int getGroupCount() {
return listDataHeader.size();
}
@Override
public int getChildrenCount(int i) {
return listHashMap.get(listDataHeader.get(i)).size();
}
@Override
public Object getGroup(int i) {
return listDataHeader.get(i);
}
@Override
public Object getChild(int i, int i1) {
return listHashMap.get(listDataHeader.get(i)).get(i1); // i= child item, i1= group item
}
@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 headerTitle = (String)getGroup(i);
if (view == null){
LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=inflater.inflate(R.layout.fragment_turboone,null);
}
TextView list1header = (TextView)view.findViewById(R.id.listturbooneheader);
list1header.setTypeface(null, Typeface.BOLD);
list1header.setText(headerTitle);
return view;
}
@SuppressLint("ResourceAsColor")
@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
final String childText = (String)getChild(i,i1);
if (view== null){
LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.fragment_turboone,null);
}
TextView txtListChild = (TextView) view.findViewById(R.id.turboone_item);
txtListChild.setTypeface(null, Typeface.NORMAL);
txtListChild.setText(childText);
return view;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
}
您对 ExpandableListView
以及每个组行和 child 行使用相同的 layout
(fragment_turboone)。您必须为 3 个组件中的每一个提供不同的布局。一种布局用于 fragment
,其中包含 ExpandableListView
,另一种用于您的组布局(headers),另一种用于您的 child 视图(组内的行)。
由于您对所有组件使用相同的布局,因此您在此布局中添加的任何 View
也会添加到列表、组和 child 中。这就是为什么您必须创建单独的布局。
片段
因此,您的片段布局应如下所示:
fragment_turboone.xml
<RelativeLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".TurbooneFragment"
android:background="@color/gray_50">
<Button
android:id="+@id/buttonId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="your text"/>
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:id="@+id/turboone_view"
android:layout_above="@id/buttonId">
</ExpandableListView>
</RelativeLayout>
群组视图
然后,您需要为您的组视图创建另一个布局(资源中 layout
文件夹内的 XML 文件):
group_layout.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/blue_500"
android:textSize="14sp"
android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
android:id="@+id/listturbooneheader"/>
</LinearLayout>
Child 查看
以及 child 视图的另一个布局:
child_layout.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"
android:id="@+id/turboone_item"
android:textColor="@android:color/black"/>
</LinearLayout>
最后,您必须正确地为每个布局充气。你的 TurbooneFragment
的 onCreateView()
是正确的,因为它膨胀 fragment_turboone
.
在您的适配器中,您必须更改为您的组膨胀的布局和 child。
在您的 TurbooneListAdapter
的 getGroupView()
中,您必须更改行:
view = inflater.inflate(R.layout.fragment_turboone, null);
为
view = inflater.inflate(R.layout.group_layout, null);
并且在 TurbooneListAdapter
的 getChildView()
中,您必须更改行:
view = inflater.inflate(R.layout.fragment_turboone, null);
为
view = inflater.inflate(R.layout.child_layout, null);
然后你应该让你的列表工作。