处理 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 之间创建通信。
我有一个可扩展的列表视图,其中每个 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 之间创建通信。