如何在ExpandableListView的子项目中更改按钮的可见性?

问题描述 投票:0回答:1

我的代码具有ExpandableListView,可以通过子级中的删除按钮来删除每个子级(时间表)。我想使用“编辑” TextView的功能,这样,如果用户单击“编辑”,则“删除”按钮将可见。我在自定义适配器MainAdapter上尝试过,但是崩溃了。有人可以帮我吗?

MainAdapter.java

package 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.setVisibility(View.INVISIBLE);
        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;
    }

    public void setDeleteVisibility(boolean visible){
        for(int j = 0; j < getGroupCount(); j ++){
            for(int i = 0; i<getChildrenCount(i); i++ ){
                if(visible){

                    scheduleDeleteBtn.setVisibility(View.VISIBLE);
                }else{
                    scheduleDeleteBtn.setVisibility(View.INVISIBLE);
                }
            }
        }
    }
}

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 {
    TextView editText;
    MainAdapter mainAdapter;
    ExpandableListView planExplandable;
    List<String> listPlanName;
    HashMap<String, List<String>> listSchedules;
    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>>();

        // get the listview
        planExplandable = (ExpandableListView) view.findViewById(R.id.plansExpandable);
        textView = view.findViewById(R.id.scheduleGroup);
        editText = view.findViewById(R.id.planEditText);


        // preparing list data
       // prepareListData();
        createAPlan(3);
        createAPlan(1);
        createAPlan(3);
        createAPlan(4);

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

        // setting list adapter
        planExplandable.setAdapter(mainAdapter);
        //mainAdapter.setDeleteVisibility(false);
 /*       editText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mainAdapter.setDeleteVisibility(true);
            }
        });*/
        return view;
    }

    public HashMap<String, String> getData(){

        return null;
    }

    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++;

    }
}

孩子的xml具有

<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:visibility="visible"
            android:clickable="true"
            ></ImageButton>
    </LinearLayout>
java android
1个回答
0
投票

在片段内部,请在listView上使用setOnItemClickListener()方法,在重写的方法中,请使用getFirstVisiblePosition()从要查找该视图位置的位置减去。然后设置可见性。

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listPosition = position - planExplandable.getFirstVisiblePosition();
if (planExplandable.getChildAt(listPosition).findViewById(R.id.yourview).getVisibility() == View.INVISIBLE) {
    //Write your logic here
    planExplandable.getChildAt(listPosition).findViewById(R.id.yourview).setVisibility(View.VISIBLE);

}

}

如果这没有帮助,请粘贴您的崩溃日志。

© www.soinside.com 2019 - 2024. All rights reserved.