在 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>

最后,您必须正确地为每个布局充气。你的 TurbooneFragmentonCreateView() 是正确的,因为它膨胀 fragment_turboone.

在您的适配器中,您必须更改为您的组膨胀的布局和 child。

在您的 TurbooneListAdaptergetGroupView() 中,您必须更改行:

view = inflater.inflate(R.layout.fragment_turboone, null);

view = inflater.inflate(R.layout.group_layout, null);

并且在 TurbooneListAdaptergetChildView() 中,您必须更改行:

view = inflater.inflate(R.layout.fragment_turboone, null);

view = inflater.inflate(R.layout.child_layout, null);

然后你应该让你的列表工作。