【发布时间】:2023-03-25 06:28:01
【问题描述】:
我有一个可扩展的列表视图,每个孩子都有一个切换按钮。当用户更改开关状态时,需要运行一些代码。问题是处理点击事件的最佳实践是什么?
活动类和适配器类是分开的类。
您可以在下面看到适配器代码。代码按预期工作,但是当用户更改开关状态时,我正在调用位于片段中的方法。为了调用该方法,我创建了一个名为“mSSLLB_Group_frag”的片段类的实例。
当片段类上配置的全局对象为空时,问题就开始了,除非我将它们声明为静态。
我不想使用静态变量,因为我认为它们是不好的做法,可能会导致内存泄漏。
我要求最佳实践的原因是片段类具有使用捆绑传递的值,并且为了处理切换事件,我必须将一些变量传递给适配器类。
你有什么建议吗?或者至少知道为什么在从适配器调用的方法中对象为空?
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;
}
}
感谢您的帮助
【问题讨论】:
-
发布一些代码。您的列表项是否已经有 Click Listener?还是实现了 OnItemClick 监听器?什么你试过了,什么没用?
-
就像@osayilgan 说的发布一些代码。您应该在适配器中处理点击事件。
-
@osayilgan 大家好,我添加了一些代码和更多细节。你有什么想法吗?
标签: android onclick expandablelistview android-adapter