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