我有自定义视图的列表视图。每个视图都包含一个editText。我正在尝试将侦听器添加到我在getView()中创建的editText变量中。问题是,当我创建监听器时,它不允许我使用editText变量,除非我将其设为final,但如果我将其设为final,我想我会在行重用时遇到问题。这是我的问题的一个简单例子:
private class MyAdapter extends ArrayAdapter<Date>{
public MyAdapter(Context context, int resource, int textViewResourceId,
List<Date> objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row;
if(convertView==null){
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.listview_cell_single, parent, false);
}else{
row = convertView;
}
EditText et = (EditText) row.findViewById(R.id.editText_single);
et.setText("" + position);
et.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus){
et.setText("You edited row: " + position);
//Error: et must be final, position must be final
}
}
});
答案 0 :(得分:0)
您应该在EditText et
中将此MyAdapter
声明为类变量。如
private class MyAdapter extends ArrayAdapter<Date>{
EditText et;
}
然后以getView();
方法启动它。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//do your stuff
........
et=(EditText) row.findViewById(R.id.editText_single);
}
答案 1 :(得分:0)
这是范围之间的契约,即堆栈与堆。在堆栈上创建的引用必须是final才能声明引用不会(并且不能)被更改,因为引用基本上由匿名类(OnFocusChangeListener)使用它进行绑定。
不会重复使用引用,因为每个堆栈都会获得自己的EditText对象引用副本。