处理按钮单击RecyclerView适配器?

时间:2015-08-21 23:12:37

标签: android button onclicklistener android-recyclerview

我的适配器RecyclerView中的按钮出现问题。当我点击它时,有时动作不会直接执行。我必须滚动一点RecyclerView,以便直接执行操作。这是我的适配器:

public class ViewHolder extends RecyclerView.ViewHolder {

    public Button btn_action;

    public ViewHolder(View vi) {
        super(vi);
        btn_action = (Button) vi.findViewById(R.id.btn_action);           
    }

    @Override
    public NewsRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.pin_item_news_recyclerview, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    public void onBindViewHolder(final ViewHolder holder, int position) {

        holder.btn_action.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                activity.TakePhoto();
            }
        });
    }
}

这是TakePhoto()在活动中的动作。

public void TakePhoto() {
    if (isIntentAvailable(getActivity(), MediaStore.ACTION_IMAGE_CAPTURE)) {
        dispatchTakePictureIntent(ACTION_TAKE_PICTURE_BIG);
    } else {
        messageRespone("Maaf, tidak bisa memanggil Camera.");
    }
}

那我该如何解决呢?感谢。

3 个答案:

答案 0 :(得分:3)

您应该让ViewHolder本身实现on click界面,然后将侦听器设置为如下按钮:

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

   public ViewHolder(View view) {
      super(view);
      button = (Button) view.findViewById(R.id.button);
      button.setOnClickListener(this);
   }

   @Override
   public void onClick(View view) {
      Toast.makeText(context, "Clicked button at position: " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
   }
}

答案 1 :(得分:0)

要解决您的问题,请在oncreateViewHolder方法中设置OnClickListner ..

在bind方法中使用它只是为了避免在你不需要它们的时候创建大量的侦听器对象btw ..我甚至不再需要绑定方法了!

OnBindViewHoler(){
   if(holder.btn_action.getOnClickListener()==null)
      holder.btn_action.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            activity.TakePhoto();
        }
    });}

答案 2 :(得分:0)

我解决了这个问题,以防万一你需要处理多个按钮

public class ViewHolder extends RecyclerView.ViewHolder {

   public ViewHolder(View view){
      super(view);
      button = (Button) view.findViewById(R.id.button);
      button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(view.getContext(), "Clicked button at position: " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
                }
            });
   }

}