java - 需要帮助来获取 listitem 在 onClickListener 中的位置

标签 java listview

我正在使用以下 LazyAdapter。我需要在点击事件中获取点击位置。我在第 20 行收到以下建议。有什么建议吗?

cannot refer to a non-final variable position inside an inner class defined in a different method

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class LazyAdapter extends BaseAdapter {

    private Activity activity;
    private List<String> data;
    private static LayoutInflater inflater = null;
    public ImageLoader imageLoader;
ArrayList<String> text= new ArrayList<String>();
    public LazyAdapter(MainActivity a, List<String> parsed_string) {
        // TODO Auto-generated constructor stub
        activity = a;
        data = parsed_string;
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public static class ViewHolder {
        public TextView text;
        public ImageView image;
        public Button click;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        ViewHolder holder;


        if (convertView == null) {
            vi = inflater.inflate(R.layout.item, null);
            holder = new ViewHolder();
            holder.text = (TextView) vi.findViewById(R.id.text);
            ;
            holder.image = (ImageView) vi.findViewById(R.id.image);
            holder.click = (Button) vi.findViewById(R.id.btn_click);
            holder.click.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Toast.makeText(activity, "clicked the button in the row",
                            Toast.LENGTH_LONG).show();
                    holder.click.setText(text.get(position)); // line 20
                }
            });
            vi.setTag(holder);
        } else
            holder = (ViewHolder) vi.getTag();

        holder.text.setText("item " + position);
        holder.image.setTag(data.get(position));

        imageLoader.DisplayImage(data.get(position), activity, holder.image);
        return vi;
    }
}

最佳答案

像这样声明getView:

public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    //...
}

匿名内部类,您只能访问final 局部变量。

发生这种情况是因为内部类的代码可能会在初始化类的方法完成并且它的局部变量被垃圾收集后被调用。声明变量 final 使变量成为常量,并将其作为值而不是引用发送到内部类。

关于java - 需要帮助来获取 listitem 在 onClickListener 中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11013894/

相关文章:

java - 访问覆盖方法java中声明的方法

java - 未找到 JUnit 文件

java - Android使用Adapter创建Listview

Android listview项目背景改变

android - ListView 与动态 View (特别是 PieChart)

listview - 如何以简单的方式为UWP实现延迟加载ListView?

java - dateTimeFormat 的有效掩码模式

java - SeekableByteChannel 是如何工作的?

java - 未调用 jsp 欢迎文件

java - onClickListener 中的 ArrayAdapter 不起作用