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

时间:2015-04-13 19:32:31

标签: android onclick expandablelistview android-adapter

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

活动类和适配器类是分隔的类。

下面的

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

当片段类上配置的全局对象为null时,问题就开始了,除非我将它们声明为静态。

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

我要求最佳实践的原因是片段类具有使用bundle传递的值,并且为了处理切换事件,我必须将一些变量传递给适配器类。

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

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


}

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

据我所知,你有一个片段,里面有一个可扩展的列表视图。而你想要的是当对列表项(或其上的孩子)采取任何行动时,将回调发送给片段。

如果我理解你的问题,那么答案很简单。您无法在片段内创建Fragment实例,该实例是适配器类的父视图。相反,您可以在Adapter Class中创建一个接口,并在Fragment中实现该接口。因此,一旦触发回调方法,它将在片段中触发事件。

如果您是这方面的新手,并且不知道如何开始,我只是找到了SOF Question关于同一问题。检查一下,了解如何通过界面在Fragment和Adapter之间建立通信。