如何为listView中的行实现一个侦听器?

时间:2013-08-19 11:45:23

标签: java android class listview listener

我有自定义视图的列表视图。每个视图都包含一个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
                }
            }
        });

2 个答案:

答案 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对象引用副本。