Android 无法在其他方法中定义的内部类中引用非最终变量l

Android 无法在其他方法中定义的内部类中引用非最终变量l,android,iteration,onclicklistener,Android,Iteration,Onclicklistener,我试图在我的Android应用程序中为一些元素设置一个OnClickListener,这些元素是动态定义的,没有给出ids,但它们被放在LinearLayouts的列表中,该列表存在于LinearLayouts中,因此我将OnClickListener设置如下: List<LinearLayout> inner_ver = setElemets(1); for (LinearLayout l: inner_ver){ l.get

我试图在我的Android应用程序中为一些元素设置一个
OnClickListener
,这些元素是动态定义的,没有给出
id
s,但它们被放在
LinearLayouts
列表中,该列表存在于
LinearLayouts
中,因此我将
OnClickListener
设置如下:

    List<LinearLayout> inner_ver = setElemets(1);

       for (LinearLayout l: inner_ver){
                l.getChildAt(0).setOnClickListener(new OnClickListener() { // here's the syntax error
                @Override
                public void onClick(View v) {
                    l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
                }
            });
        }
List-internal\u-ver=setElemets(1);
用于(线性布局l:内部版本){
l、 getChildAt(0).setOnClickListener(新的OnClickListener(){//以下是语法错误
@凌驾
公共void onClick(视图v){
l、 getChildAt(1).挫折背景资源(R.drawable.home_curtopen);
}
});
}

但是我得到了标题中提到的
l
的语法错误,我不能仅仅将其声明为
final
,因为它只将更改分配给
列表中的最后一个元素

拆分为一个单独的方法:

    for (LinearLayout l: inner_ver){
        assignListener(l);
    }

public void assignListener(final LinearLayout l) {
    l.getChildAt(0).setOnClickListener(new View.OnClickListener() { 
        @Override
        public void onClick(View v) {
            l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
        }
    });
}

分为单独的方法:

    for (LinearLayout l: inner_ver){
        assignListener(l);
    }

public void assignListener(final LinearLayout l) {
    l.getChildAt(0).setOnClickListener(new View.OnClickListener() { 
        @Override
        public void onClick(View v) {
            l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
        }
    });
}

您还可以创建自己的OnClickListener类:

class MyOnClickListener implements OnClickListener{
    private LinearLayout layout;

    public MyOnClickListener(LinearLayout layout){
        this.layout = layout;
    }

    @Override
    public void onClick(View v) {
        layout.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
    }

}
然后将循环更改为:

for (LinearLayout l: inner_ver){
    l.getChildAt(0).setOnClickListener(new MyOnClickListener(l));
}

您还可以创建自己的OnClickListener类:

class MyOnClickListener implements OnClickListener{
    private LinearLayout layout;

    public MyOnClickListener(LinearLayout layout){
        this.layout = layout;
    }

    @Override
    public void onClick(View v) {
        layout.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
    }

}
然后将循环更改为:

for (LinearLayout l: inner_ver){
    l.getChildAt(0).setOnClickListener(new MyOnClickListener(l));
}

您可以将
final
添加到for循环中

List<LinearLayout> inner_ver = setElemets(1);

   for (final LinearLayout l: inner_ver){
            l.getChildAt(0).setOnClickListener(new OnClickListener() { // here's the syntax error
            @Override
            public void onClick(View v) {
                l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
            }
        });
    }
List-internal\u-ver=setElemets(1);
用于(最终线性布局l:内部版本){
l、 getChildAt(0).setOnClickListener(新的OnClickListener(){//以下是语法错误
@凌驾
公共void onClick(视图v){
l、 getChildAt(1).挫折背景资源(R.drawable.home_curtopen);
}
});
}
中解释了为什么
for(最终类型名称:Iterable)
有效


您可以将
final
添加到for循环中

List<LinearLayout> inner_ver = setElemets(1);

   for (final LinearLayout l: inner_ver){
            l.getChildAt(0).setOnClickListener(new OnClickListener() { // here's the syntax error
            @Override
            public void onClick(View v) {
                l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
            }
        });
    }
List-internal\u-ver=setElemets(1);
用于(最终线性布局l:内部版本){
l、 getChildAt(0).setOnClickListener(新的OnClickListener(){//以下是语法错误
@凌驾
公共void onClick(视图v){
l、 getChildAt(1).挫折背景资源(R.drawable.home_curtopen);
}
});
}
中解释了为什么
for(最终类型名称:Iterable)
有效


它还只是处理列表中最后一个似乎不正确的布局。您的代码中的其他地方可能有错误吗?布局L分别适用于循环中的每个迭代。你是对的,我还有另一个错误,但在更正后,你的方式与meit配合得很好。它还处理列表中最后一个似乎不正确的布局。您的代码中的其他地方可能有错误吗?布局L分别适用于循环中的每个迭代。你是对的,我还有另一个错误,但在更正后,你的方式与我配合得很好。他说这仍然只分配了最后循环迭代的单击,但考虑到他也不喜欢我的答案,我认为你的是正确的,他在代码的其他地方有一个逻辑错误。@GregEnnis很可能
l.getChildAt(0)
可能一直都是同一件事。你的观点也是对的,但我只是把它投了赞成票,选择了“最老的”正确答案作为被接受的答案answer@MRefaat那很好。你接受的那个在风格上也有点简洁,因为它增加了易读性。他说这仍然只是给最后的循环迭代分配了单击,但考虑到他也不喜欢我的答案,我认为你的答案是正确的,他在代码的其他地方有一个逻辑错误。@GregEnnis最有可能
l.getChildAt(0)
可能一直都是同一件事。你的观点也是对的,但我只是把它投了赞成票,选择了“最老的”正确答案作为被接受的答案answer@MRefaat那很好。你接受的那一个在风格上也比较干净,因为它增加了易读性