【问题标题】:android move OnClickListener form adapter to ListFragmentandroid将OnClickListener表单适配器移动到ListFragment
【发布时间】:2014-03-10 19:53:37
【问题描述】:


我有 ListFragment 和一个自定义适配器。
我列表中的每一行都包含两个 TextView 和一个 ImageButton。 我想在单击图像按钮时调用一个方法。

public class MyCustomAdapter extends SimpleAdapter {

private final Context context;
private final List<? extends Map<String,? >> data;
private final String[] from;

    public MyCustomAdapter(Context context, List<? extends Map<String, ?>> data, String[] from) {
        super(context, data, R.layout.list_item, from, new int[]{R.id.firstLine, R.id.secondLine});
        this.context=context;
        this.data=data;
        this.from=from;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.list_item, parent, false);
        TextView firstLine = (TextView) rowView.findViewById(R.id.firstLine);
        TextView secondLine = (TextView) rowView.findViewById(R.id.secondLine);
        firstLine.setText((CharSequence) data.get(position).get(from[0]));
        secondLine.setText((CharSequence) data.get(position).get(from[1]));
        ImageButton imageButton = (ImageButton) rowView.findViewById(R.id.tourItemDelete);
        final long tourId = (Long) data.get(position).get("key");
        imageButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //do something dependend on tourId


            }
        });


        return rowView;
    }

我想在我的 ListFragment 中有这个 onClickListener

我的 ListFragment 中的 onListItemClick 方法仅在我单击两个 TextView 之一时调用,但在单击 ImageButton 时不调用。

  1. 是否可以将此 onClickListener 从我的适配器移动到 ListFragment? tourId 也应该从我的适配器传递到 ListFragment 中的方法。
  2. 为什么单击 ImageButton 时未调用 ListFragment 中的 onListItemClick 方法?

【问题讨论】:

    标签: android listview onclicklistener


    【解决方案1】:

    我的一个朋友帮助了我,并向我展示了如何解决我的问题。

    我在我的适配器中创建了一个接口并在我的片段中实现了它。

    public class MyCustomAdapter extends SimpleAdapter {
    
    private OnImgClicked mImageClicked;
    private final Context context;
    private final List<? extends Map<String,? >> data;
    private final String[] from;
    
    public MyCustomAdapter(Context context, List<? extends Map<String, ?>> data, String[] from) {
        super(context, data, R.layout.list_item, from, new int[]{R.id.firstLine, R.id.secondLine});
        this.context=context;
        this.data=data;
        this.from=from;
    
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.list_item, parent, false);
        TextView firstLine = (TextView) rowView.findViewById(R.id.firstLine);
        TextView secondLine = (TextView) rowView.findViewById(R.id.secondLine);
        firstLine.setText((CharSequence) data.get(position).get(from[0]));
        secondLine.setText((CharSequence) data.get(position).get(from[1]));
        ImageButton imageButton = (ImageButton) rowView.findViewById(R.id.tourItemDelete);
        final long tourId = (Long) data.get(position).get("key");
        imageButton.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                mImageClicked.imgClicked(tourId);
    
            }
        });
    
        return rowView;
    }
    
    public interface OnImgClicked {
        public void imgClicked(long tourId);
    }
    
    public void setOnImgClickListener(OnImgClicked imgClicked) {
        this.mImageClicked = imgClicked;
    }
    }
    

    在片段中实现接口

    public class MyFragment extends ListFragment implements MyCustomAdapter.OnImgClicked {
        //...other methods like
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        [...]//init/create variables for MyCustomAdapter Creation
        MyCutsomAdapter adapter = new MyCustomAdapter(getActivity(),....);
        adapter.setOnImgClickListener(this);
    
        }
    
        @Override
        public void imgClicked(long tourId) {
            //do something with tourId
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      在getView中做

      imgBtn.setFocusable(false);
              imgBtn.setClickable(false);  
      

      这应该可以解决您的点击问题

      【讨论】:

      • 是的,我的 ListFragment 中的 onListItemClick 方法被调用(当点击 imgBtn 时)。但是如何确定是否单击了 ImageButton 或 TextView 之一?我想区分一行中的项目。
      • 你只为图片按钮设置了点击监听,所以这个函数只在你点击文本视图按钮时调用你可以添加另一个点击监听
      猜你喜欢
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多