处理 child 视图中内部切换按钮的 onclick 事件

handle onclick event for inner switch button in child view

我有一个可扩展的列表视图,其中每个 child 都有一个切换按钮。当用户改变开关状态时,一些代码需要运行。问题是处理点击事件的最佳做法是什么?

activity class 和适配器 class 是分开的 class。

您可以在下面看到适配器代码。该代码按预期工作,但是当用户更改开关状态时,我正在调用位于片段中的方法。我创建了片段 class 的一个实例,名为 "mSSLLB_Group_frag" 以调用该方法。

当在片段 class 上配置的全局 objects 为空时问题开始,除非我将它们声明为静态。

我不想使用静态变量,因为我认为它们是不好的做法,会导致内存泄漏。

我要求最佳实践的原因是片段 class 具有使用 bundle 传递的值,为了处理切换事件,我将不得不将一些变量传递给适配器 class.

你有什么建议吗?或者至少知道为什么 objects 在从适配器调用的方法中为空?

public class SSLLB_GRP_EXP_LST_ADAPTER extends BaseExpandableListAdapter{

    private Context CNTX;
    private List<SSLLB_GROUP_get_set>SSLLB_GRP_PARENT=new ArrayList<>() ;
    private LinkedHashMap<Integer, List<SSLLB_GROUP_get_set_child>> listDataChildResult = new LinkedHashMap<>();
    protected static Boolean oper_failed=false;
    private static final SSLLB_Group_frag mSSLLB_Group_frag=new SSLLB_Group_frag();




    public SSLLB_GRP_EXP_LST_ADAPTER(List<SSLLB_GROUP_get_set> _SSLLB_GRP_PARENT,LinkedHashMap<Integer, List<SSLLB_GROUP_get_set_child>>  _listDataChildResult,Context _CNTX){
        this.SSLLB_GRP_PARENT=_SSLLB_GRP_PARENT;
        this.listDataChildResult=_listDataChildResult;
        this.CNTX=_CNTX;
    }

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

    @Override
    public int getChildrenCount(int groupPosition) {
        return listDataChildResult.get(groupPosition).size();
    }

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

    @Override
    public SSLLB_GROUP_get_set_child getChild(int groupPosition, int childPosition) {
        return listDataChildResult.get(groupPosition).get(childPosition);
    }

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

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

    @Override
    public boolean hasStableIds() {

        return false;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {

        View parentView =convertView;
        ViewHolder holder=new ViewHolder();

        LayoutInflater inflater = (LayoutInflater)this.CNTX.getSystemService
                  (Context.LAYOUT_INFLATER_SERVICE);

        if(parentView==null)
        {

            parentView = inflater.inflate(R.layout.grp_inx_list_layout, parent, false);
            holder.grp_names=(TextView)parentView.findViewById(R.id.tv_Grp_Names);
            holder.grp_metrics=(TextView)parentView.findViewById(R.id.tv_Grp_Metrics);
            holder.grp_he=(TextView)parentView.findViewById(R.id.tv_Grp_He);
            parentView.setTag(holder);
        }
        else{

            holder=(ViewHolder)parentView.getTag();
        }

        holder.grp_names.setText(SSLLB_GRP_PARENT.get(groupPosition).Get_Grp_Inx());
        holder.grp_metrics.setText(SSLLB_GRP_PARENT.get(groupPosition).Get_Grp_Metrics());
        holder.grp_he.setText(SSLLB_GRP_PARENT.get(groupPosition).Get_Grp_He());




        return parentView;
    }

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

        View childView=convertView;
        LayoutInflater inflaterchild = (LayoutInflater)this.CNTX.getSystemService
                  (Context.LAYOUT_INFLATER_SERVICE);

        ViewHolder holder=new ViewHolder();

        if(childView==null){

            childView = inflaterchild.inflate(R.layout.group_exp_list_child_layout, parent, false);
            holder.grp_rl_inx=(TextView)childView.findViewById(R.id.tv_rl_SR_name_in_GRP);
            holder.grp_rl_stat=(TextView)childView.findViewById(R.id.tv_Rl_SR_stat);
            holder.OPR_R_SR=(Switch)childView.findViewById(R.id.sw_rl_dis_en);
            childView.setTag(holder);
        }

        else {
            holder=(ViewHolder)childView.getTag();
        }



        holder.grp_rl_inx.setText(getChild(groupPosition,childPosition).get_sr_inx());
        holder.grp_rl_stat.setText(getChild(groupPosition,childPosition).getRL_SR_STAT_STR());

        if(getChild(groupPosition,childPosition).get_sr_stat()==1){
            holder.OPR_R_SR.setChecked(true);


        }
        else {
                holder.OPR_R_SR.setChecked(false);

        }

        holder.OPR_R_SR.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Switch cb_state = (Switch) v.findViewById(R.id.sw_rl_dis_en);

                try {

                    if (cb_state.isChecked()) {
                        mSSLLB_Group_frag.set_SR_STAT(getChild(groupPosition, childPosition), 1);
                    }

                    else  {

                         mSSLLB_Group_frag.set_SR_STAT(getChild(groupPosition, childPosition), 2);
                    }
                }
                catch (Exception e){
                    e.printStackTrace();
                }
            }

            });



        return childView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {

        return true;
    }






public final class  ViewHolder
{
   TextView grp_names;
   TextView grp_metrics;
   TextView grp_he;
   TextView grp_rl_inx;
   TextView grp_rl_stat;
   Switch   OPR_R_SR;
}


}

感谢您的帮助

据我从你的问题中了解到,你有一个片段,里面有一个可扩展的列表视图。而您想要的是在对列表项(或其子项)执行任何操作时向片段发送回调。

如果我正确理解了你的问题,那么答案很简单。您不能在您的片段内创建片段的实例,它是您的适配器 class 的父视图。相反,您可以在适配器 Class 中创建一个接口并在片段中实现该接口。所以一旦触发回调方法,它就会触发 Fragment 中的事件。

如果您是这个主题的新手并且不知道如何开始,我刚刚找到了一个关于相同问题的 SOF Question。查看它以了解如何通过接口在 Fragment 和 Adapter 之间创建通信。