我有可扩展的列表视图,其中每个孩子都持有一个开关按钮。当用户更改交换机状态时,某些代码需要运行。问题是处理点击事件的最佳做法是什么?
活动类和适配器类是分隔的类。
下面的可以看到适配器代码。代码按预期工作,但是当用户更改开关状态时,我调用的是位于片段中的方法。我创建了一个名为" 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;
}
}
感谢您的帮助
答案 0 :(得分:1)
据我所知,你有一个片段,里面有一个可扩展的列表视图。而你想要的是当对列表项(或其上的孩子)采取任何行动时,将回调发送给片段。
如果我理解你的问题,那么答案很简单。您无法在片段内创建Fragment实例,该实例是适配器类的父视图。相反,您可以在Adapter Class中创建一个接口,并在Fragment中实现该接口。因此,一旦触发回调方法,它将在片段中触发事件。
如果您是这方面的新手,并且不知道如何开始,我只是找到了SOF Question关于同一问题。检查一下,了解如何通过界面在Fragment和Adapter之间建立通信。