java - 如何在Android Studio中向ExpandableListView添加按钮?

标签 java android

我们正在开发一款用于创建计划和时间表的 Android 应用程序。我有一个 ExpandableListView,我需要添加删除按钮,用户可以在其中删除特定计划或完整计划。计划项是计划项的子项。

我正在开发先删除时间表部分。我认为每个子项目都可以包含一个 TextView 和删除按钮。这是schedule_group.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="2">

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1.8">

    <TextView
        android:id="@+id/scheduleGroup"
        android:layout_width="355dp"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:textColor="@android:color/black" />
</LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.2">

        <ImageButton
            android:id="@+id/scheduleDeleteBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            app:srcCompat="@drawable/delete_icon"
            android:clickable="true"
            ></ImageButton>
    </LinearLayout>

</LinearLayout>

这是 PlansFragment.java,我在其中创建和删除计划和时间表。

package com.example.easyplan;


import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageButton;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


/**
 * A simple {@link Fragment} subclass.
 */
public class PlansFragment extends Fragment {
    MainAdapter mainAdapter;
    ExpandableListView planExplandable;
    List<String> listPlanName;
    HashMap<String, List<String>> listSchedules;
    ImageButton scheduleDeleteBtn;
    TextView textView;
    static int count = 0;
    View view;

    public PlansFragment() {

        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment_plans_fragment, container, false);
        listPlanName = new ArrayList<String>();
        listSchedules = new HashMap<String, List<String>>();
        scheduleDeleteBtn = view.findViewById(R.id.scheduleDeleteBtn);
        scheduleDeleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                deleteSchedule();
            }
        });
        // get the listview
        planExplandable = (ExpandableListView) view.findViewById(R.id.plansExpandable);
        textView = view.findViewById(R.id.scheduleGroup);

        createAPlan(3);
        createAPlan(1);
        createAPlan(3);
        createAPlan(4);

        mainAdapter = new MainAdapter(getActivity(), listPlanName, listSchedules);

        // setting list adapter
        planExplandable.setAdapter(mainAdapter);
        return view;
    }

问题出在这里:

    private void deleteSchedule() {

    }


    private void createAPlan(int sch){
        listPlanName.add("Plan#"+(count+1));
        List<String> schedules = new ArrayList<String>();
        if(sch > 0 ){
            for (int i = 1; i <= sch; i++){
                schedules.add("Schedule#" + i);
            }
        }
        listSchedules.put(listPlanName.get(count),schedules);
        count++;

    }



}

我不确定如何通过按钮访问子项目。如果你能帮忙那就太好了!谢谢。

最佳答案

我在 getChildView() 方法下添加了删除部分。如果有人需要类似的解决方案: 包 com.example.easyplan;

import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageButton;
import android.widget.TextView;

import java.util.HashMap;
import java.util.List;

public class MainAdapter extends BaseExpandableListAdapter {
    private Context _context;
    private List<String> listPlan; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<String>> listScheduleMap;
    ImageButton scheduleDeleteBtn;

    public MainAdapter(Context context, List<String> listDataHeader,
                       HashMap<String, List<String>> listChildData) {
        this._context = context;
        this.listPlan = listDataHeader;
        this.listScheduleMap = listChildData;
    }
    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this.listScheduleMap.get(this.listPlan.get(groupPosition))
                .get(childPosititon);
    }

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

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

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.schedule_group, null);
        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.scheduleGroup);
        scheduleDeleteBtn = convertView.findViewById(R.id.scheduleDeleteBtn);
        scheduleDeleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<String> plan = listScheduleMap.get(listPlan.get(groupPosition));
                plan.remove(childPosition);
                notifyDataSetChanged();
            }
        });
        txtListChild.setText(childText);
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this.listScheduleMap.get(this.listPlan.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this.listPlan.get(groupPosition);
    }

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

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

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

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.planGroup);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

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

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

关于java - 如何在Android Studio中向ExpandableListView添加按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61159105/

相关文章:

android - 如何在ListView中实现 Action 监听器?

android - 我们可以在 android 中为 TargetApi 注释样式吗

java - 移动平台上的 JasperReports

java - Web 服务 SOAP 请求的默认超时?

java - 批量运行ModelControllerClient

android - 尝试更改选项卡指示器颜色

android - SpongycaSTLe 在 android 上加载时缺少许多算法

java - 当在不同的类中使用时,我的PrintWriter的值变得无效

java - 时间戳插入到 sql 给我错误

android - 如何在 Android 上将 8 位二进制图像数据加载到 OpenGL ES 2 纹理中