Android 为什么setOnClickListener不能在带有recyclerview的适配器中工作?

Android 为什么setOnClickListener不能在带有recyclerview的适配器中工作?,android,android-recyclerview,onclicklistener,Android,Android Recyclerview,Onclicklistener,我只是简单地将setOnClickListener实现为适配器,这与一天前setOnClickListener的工作方式相同 几天前我遇到了同样的问题,但我做了另一个适配器,它成功了,但今天我再次遇到同样的问题 虽然我在谷歌上搜索了一下,但确实得到了答案,我在这里发布了一个问题,问我经常遇到的错误的原因是什么,请记住这一点,以便进一步编码 适配器类 更新xml 试试下面的一个代码 public class ViewAdapter extends RecyclerView.Adapter<V

我只是简单地将setOnClickListener实现为适配器,这与一天前setOnClickListener的工作方式相同

几天前我遇到了同样的问题,但我做了另一个适配器,它成功了,但今天我再次遇到同样的问题

虽然我在谷歌上搜索了一下,但确实得到了答案,我在这里发布了一个问题,问我经常遇到的错误的原因是什么,请记住这一点,以便进一步编码

适配器类

更新xml

试试下面的一个代码

public class ViewAdapter extends RecyclerView.Adapter<ViewAdapter.Holder> {

private List<Model> list;
private Context mContext;//Init Context

public ViewAdapter(List<Model> list,Context _context) {
    this.list = list;
    this.mContext = _context;//getting your activity context
}

@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false));
}

@Override
public void onBindViewHolder(final Holder holder, final int position) {
    final Model model = list.get(position);
    holder.mParent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (model.getStatus().equalsIgnoreCase("done")) {
                if (!model.getFilePath().equals("") && model.getFilePath() != null) {
                   /* Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(model.getFilePath()));
                    intent.setDataAndType(Uri.parse(model.getFilePath()), "video*//*");*/
                    Intent intent = new Intent(holder.itemView.getContext(), CustomPlayer.class);
                    intent.putExtra("path", model.getFilePath());
                    holder.itemView.getContext().startActivity(intent);
                }
            } else {
                Toast.makeText(mContext, "file not found", Toast.LENGTH_SHORT).show();//here your using context

            }
        }
    });




}

@Override
public int getItemCount() {
    return list.size();
}

public class Holder extends RecyclerView.ViewHolder {
    TextView title, percentage, downloaded;
    ProgressBar progressBar;
    ImageView pause, resume;
    LinearLayout bottom;
    View itemView;
    CardView mParent;

    //   TextView textView;

    public Holder(final View itemView) {
        super(itemView);
        this.itemView = itemView;
        //   textView = (TextView) itemView.findViewById(R.id.textview);
        mParent = (CardView)itemView.findViewById(R.id.cardview);
        title = (TextView) itemView.findViewById(R.id.video_title);
        percentage = (TextView) itemView.findViewById(R.id.txt_percentage);
        downloaded = (TextView) itemView.findViewById(R.id.txt_downloaded);
        progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar);
        pause = (ImageView) itemView.findViewById(R.id.img_pause);
        resume = (ImageView) itemView.findViewById(R.id.img_resume);
        bottom = (LinearLayout) itemView.findViewById(R.id.bottom);
    }
 }
}
试试下面的一个代码

public class ViewAdapter extends RecyclerView.Adapter<ViewAdapter.Holder> {

private List<Model> list;
private Context mContext;//Init Context

public ViewAdapter(List<Model> list,Context _context) {
    this.list = list;
    this.mContext = _context;//getting your activity context
}

@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false));
}

@Override
public void onBindViewHolder(final Holder holder, final int position) {
    final Model model = list.get(position);
    holder.mParent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (model.getStatus().equalsIgnoreCase("done")) {
                if (!model.getFilePath().equals("") && model.getFilePath() != null) {
                   /* Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(model.getFilePath()));
                    intent.setDataAndType(Uri.parse(model.getFilePath()), "video*//*");*/
                    Intent intent = new Intent(holder.itemView.getContext(), CustomPlayer.class);
                    intent.putExtra("path", model.getFilePath());
                    holder.itemView.getContext().startActivity(intent);
                }
            } else {
                Toast.makeText(mContext, "file not found", Toast.LENGTH_SHORT).show();//here your using context

            }
        }
    });




}

@Override
public int getItemCount() {
    return list.size();
}

public class Holder extends RecyclerView.ViewHolder {
    TextView title, percentage, downloaded;
    ProgressBar progressBar;
    ImageView pause, resume;
    LinearLayout bottom;
    View itemView;
    CardView mParent;

    //   TextView textView;

    public Holder(final View itemView) {
        super(itemView);
        this.itemView = itemView;
        //   textView = (TextView) itemView.findViewById(R.id.textview);
        mParent = (CardView)itemView.findViewById(R.id.cardview);
        title = (TextView) itemView.findViewById(R.id.video_title);
        percentage = (TextView) itemView.findViewById(R.id.txt_percentage);
        downloaded = (TextView) itemView.findViewById(R.id.txt_downloaded);
        progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar);
        pause = (ImageView) itemView.findViewById(R.id.img_pause);
        resume = (ImageView) itemView.findViewById(R.id.img_resume);
        bottom = (LinearLayout) itemView.findViewById(R.id.bottom);
    }
 }
}

我也有同样的问题。在多次尝试之后,我注意到xml属性以某种方式禁用了ItemView clickListener。所以我从布局中删除了下面的代码,它现在可以工作了

android:clickable="true"
android:focusable="true"

根据我的经验,这绝对有效。

我也有同样的问题。在多次尝试之后,我注意到xml属性以某种方式禁用了ItemView clickListener。所以我从布局中删除了下面的代码,它现在可以工作了

android:clickable="true"
android:focusable="true"

根据我的经验,这绝对有效。

在适配器的构造函数中,传递getActivity对我有效,而不是在适配器的构造函数中传递getContex,传递getActivity而不是getContex对我有效

将更新xml从RelativeLayout更改为LinearLayout

将更新xml从RelativeLayout更改为LinearLayout

尝试以下代码

视图适配器

试试这个代码

视图适配器



我会更好,如果向下解释它'这段代码是刚刚好,一旦点击监听器将在这种情况下工作。请检查您的if条件。@anddevmanu但它不起作用在if条件之前和之后在侦听器中添加日志,以便您知道result@anddevmanu试过了,但不起作用。如果在这种情况下,单击listener就可以工作,那么这段代码就很好了。请检查您的if条件。@anddevmanu但它不起作用在if条件之前和之后在侦听器中添加日志,以便您知道result@anddevmanu已尝试但未工作Holder.cardView.setOnClickListenernew View.OnClickListener{@Override public void onClickView v{Toast.makeTextholder.itemView.getContext、cardview、Toast.LENGTH\u SHORT.show;};no lucksee my edited code因为您没有获取活动的上下文,而您使用适配器总是在适配器构造函数中传递活动的上下文??hilight the change您只需替换我的适配器代码,我就可以添加commentholder.cardwiew.setonclicklistener new View.OnClickListener{@Override public void onClickView v{Toast.makeTextholder.itemView.getContext、cardview、Toast.LENGTH\u SHORT.show;};不幸运,请看我编辑的代码,因为您没有获取活动的上下文,而您使用的adapterAlways在适配器构造函数中传递活动的上下文??hilight更改您只需替换我的适配器代码,我将添加commentGenius。奇怪到Google SDK文档不指示这样做。Genius。奇怪到Google SDK文档不指示这样做这是。请在您的答案中包含您的代码,并解释其如何工作以及为什么它可以解决问题中所述的问题。请参阅。请在您的答案中包含您的代码,并解释其如何工作以及为什么它可以解决问题中所述的问题。请参阅。
public class ViewAdapter extends RecyclerView.Adapter<ViewAdapter.Holder> {

private List<Model> list;
private Context mContext;//Init Context

public ViewAdapter(List<Model> list,Context _context) {
    this.list = list;
    this.mContext = _context;//getting your activity context
}

@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false));
}

@Override
public void onBindViewHolder(final Holder holder, final int position) {
    final Model model = list.get(position);
    holder.mParent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (model.getStatus().equalsIgnoreCase("done")) {
                if (!model.getFilePath().equals("") && model.getFilePath() != null) {
                   /* Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(model.getFilePath()));
                    intent.setDataAndType(Uri.parse(model.getFilePath()), "video*//*");*/
                    Intent intent = new Intent(holder.itemView.getContext(), CustomPlayer.class);
                    intent.putExtra("path", model.getFilePath());
                    holder.itemView.getContext().startActivity(intent);
                }
            } else {
                Toast.makeText(mContext, "file not found", Toast.LENGTH_SHORT).show();//here your using context

            }
        }
    });




}

@Override
public int getItemCount() {
    return list.size();
}

public class Holder extends RecyclerView.ViewHolder {
    TextView title, percentage, downloaded;
    ProgressBar progressBar;
    ImageView pause, resume;
    LinearLayout bottom;
    View itemView;
    CardView mParent;

    //   TextView textView;

    public Holder(final View itemView) {
        super(itemView);
        this.itemView = itemView;
        //   textView = (TextView) itemView.findViewById(R.id.textview);
        mParent = (CardView)itemView.findViewById(R.id.cardview);
        title = (TextView) itemView.findViewById(R.id.video_title);
        percentage = (TextView) itemView.findViewById(R.id.txt_percentage);
        downloaded = (TextView) itemView.findViewById(R.id.txt_downloaded);
        progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar);
        pause = (ImageView) itemView.findViewById(R.id.img_pause);
        resume = (ImageView) itemView.findViewById(R.id.img_resume);
        bottom = (LinearLayout) itemView.findViewById(R.id.bottom);
    }
 }
}
android:clickable="true"
android:focusable="true"
import com.android.Youtubedownloader.R;
import com.android.Youtubedownloader.activities.CustomPlayer;
import com.android.Youtubedownloader.database.Model;
import com.tonyodev.fetch.Fetch;
import com.tonyodev.fetch.request.RequestInfo;

import java.util.List;

import static com.android.Youtubedownloader.service.AppService.fetch;
 
public class ViewAdapter extends RecyclerView.Adapter<ViewAdapter.Holder> {

    private List<Model> list;
    private OnItemClickListener listener;

    public ViewAdapter(List<Model> list) {
        this.list = list;
    }

    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false));
    }

    @Override
    public void onBindViewHolder(final Holder holder, final int position) {
        final Model model = list.get(position);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class Holder extends RecyclerView.ViewHolder {
        TextView title, percentage, downloaded;
        ProgressBar progressBar;
        ImageView pause, resume;
        LinearLayout bottom;
        View itemView;

        //   TextView textView;

        public Holder(final View itemView) {
            super(itemView);
            this.itemView = itemView;
            //   textView = (TextView) itemView.findViewById(R.id.textview);
            title = (TextView) itemView.findViewById(R.id.video_title);
            percentage = (TextView) itemView.findViewById(R.id.txt_percentage);
            downloaded = (TextView) itemView.findViewById(R.id.txt_downloaded);
            progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar);
            pause = (ImageView) itemView.findViewById(R.id.img_pause);
            resume = (ImageView) itemView.findViewById(R.id.img_resume);
            bottom = (LinearLayout) itemView.findViewById(R.id.bottom);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                     int position = getAdapterPosition();
                     if (listener != null && position != RecyclerView.NO_POSITION) 
                     {
                         listener.OnItemClick(getItem(position));
                     }
                }
            });
        }
        
    }  
    public interface OnItemClickListener {
       void OnItemClick(ChildActivityList item);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
       this.listener = listener;
    }
}
adater.setOnItemClickListener(new OnItemClickListener);