如何在 recyclerview 适配器上添加长按监听器?
How to add long click listener on recyclerview adapter?
我已经实施了 onClick
现在我想添加 onLongClick
,我搜索了没有符合我的情况的解决方案,因为我的适配器设置不同
适配器
public class StudioAdapter extends RecyclerView.Adapter<StudioAdapter.StudioViewHolder> {
public interface OnItemClickListener {
void onItemClick(int item);
}
private List<String> StudioLogoPaths;
private OnItemClickListener listener;
public StudioAdapter(List<String> StudioLogoPaths, OnItemClickListener listener) {
this.StudioLogoPaths = (List<String>) StudioLogoPaths;
this.listener = listener;
}
@Override
public StudioAdapter.StudioViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.studio_logo, parent, false);
StudioViewHolder vh = new StudioViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder( StudioAdapter.StudioViewHolder vh, int position) {
final String path = StudioLogoPaths.get(position);
Glide.with(vh.itemView.getContext()).load(path).into(vh.logoImage);
String basepath = "/data/user/0/org.courville.nova/app_scraper_studiologos/";
String extension = ".png";
final String clicked_studioname = path.replace(basepath, "").replace(extension, "");
final int Position = position;
vh.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(Position);
Toast.makeText(vh.itemView.getContext(), clicked_studioname, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return StudioLogoPaths.size();
}
public class StudioViewHolder extends RecyclerView.ViewHolder {
protected ImageView logoImage;
public StudioViewHolder(View itemView) {
super(itemView);
logoImage = itemView.findViewById(R.id.studio_logo);
}
}
}
我的片段
StudioAdapter.OnItemClickListener studioLogoCallback = new StudioAdapter.OnItemClickListener() {
@Override
public void onItemClick(int item) {
Glide.with(mContext).clear(mLogo);
Glide.with(mContext).load(tags.getStudioLogosLargeFileF().get(item))
.fitCenter().into(mLogo);
List<ScraperImage> scraperImage = tags.getStudioLogos();
ScraperImage clickedImage = (ScraperImage) scraperImage.get(item);
new VideoInfoActivityFragment.ClearLogoSaver(mContext, new VideoInfoActivityFragment()).execute(clickedImage);
}
};
final StudioAdapter studioAdapter = new StudioAdapter(StudioLogoPaths,studioLogoCallback);
studios.setAdapter(studioAdapter);
您需要在界面中添加第二种方法来表示长按事件。然后,在 onBindViewHolder
中,添加 vh.itemView.setOnLongClickListener(...)
,您将在其中调用第二个方法。
编辑:
您的界面现在应该如下所示:
public interface OnItemClickListener {
void onItemClick(int item);
void onItemLongClick(int item);
}
我是这样解决的:
适配器
public class StudioAdapter extends RecyclerView.Adapter<StudioAdapter.StudioViewHolder> {
public interface OnItemClickListener {
void onItemClick(int item);
void onItemLongClick(int position);
}
private List<String> StudioLogoPaths;
private OnItemClickListener listener;
public StudioAdapter(List<String> StudioLogoPaths, OnItemClickListener listener) {
this.StudioLogoPaths = (List<String>) StudioLogoPaths;
this.listener = listener;
}
@Override
public StudioAdapter.StudioViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.studio_logo, parent, false);
StudioViewHolder vh = new StudioViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder( StudioAdapter.StudioViewHolder vh, int position) {
final String path = StudioLogoPaths.get(position);
Glide.with(vh.itemView.getContext()).load(path).into(vh.logoImage);
String basepath = "/data/user/0/org.courville.nova/app_scraper_studiologos/";
String extension = ".png";
final String clicked_studioname = path.replace(basepath, "").replace(extension, "");
final int Position = position;
vh.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(Position);
Toast.makeText(vh.itemView.getContext(), clicked_studioname, Toast.LENGTH_SHORT).show();
}
});
vh.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
listener.onItemLongClick(Position);
return false;
}
});
}
@Override
public int getItemCount() {
return StudioLogoPaths.size();
}
public class StudioViewHolder extends RecyclerView.ViewHolder {
protected ImageView logoImage;
public StudioViewHolder(View itemView) {
super(itemView);
logoImage = itemView.findViewById(R.id.studio_logo);
}
}
}
片段
StudioAdapter.OnItemClickListener studioLogoCallback = new StudioAdapter.OnItemClickListener() {
@Override
public void onItemClick(int item) {
}
@Override
public void onItemLongClick(int position) {
Glide.with(mContext).clear(mLogo);
Glide.with(mContext).load(tags.getStudioLogosLargeFileF().get(position))
.fitCenter().into(mLogo);
ScraperImage clickedImage = (ScraperImage) scraperImage.get(position);
new VideoInfoActivityFragment.ClearLogoSaver(mContext, new VideoInfoActivityFragment()).execute(clickedImage);
}
};
我已经实施了 onClick
现在我想添加 onLongClick
,我搜索了没有符合我的情况的解决方案,因为我的适配器设置不同
适配器
public class StudioAdapter extends RecyclerView.Adapter<StudioAdapter.StudioViewHolder> {
public interface OnItemClickListener {
void onItemClick(int item);
}
private List<String> StudioLogoPaths;
private OnItemClickListener listener;
public StudioAdapter(List<String> StudioLogoPaths, OnItemClickListener listener) {
this.StudioLogoPaths = (List<String>) StudioLogoPaths;
this.listener = listener;
}
@Override
public StudioAdapter.StudioViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.studio_logo, parent, false);
StudioViewHolder vh = new StudioViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder( StudioAdapter.StudioViewHolder vh, int position) {
final String path = StudioLogoPaths.get(position);
Glide.with(vh.itemView.getContext()).load(path).into(vh.logoImage);
String basepath = "/data/user/0/org.courville.nova/app_scraper_studiologos/";
String extension = ".png";
final String clicked_studioname = path.replace(basepath, "").replace(extension, "");
final int Position = position;
vh.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(Position);
Toast.makeText(vh.itemView.getContext(), clicked_studioname, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return StudioLogoPaths.size();
}
public class StudioViewHolder extends RecyclerView.ViewHolder {
protected ImageView logoImage;
public StudioViewHolder(View itemView) {
super(itemView);
logoImage = itemView.findViewById(R.id.studio_logo);
}
}
}
我的片段
StudioAdapter.OnItemClickListener studioLogoCallback = new StudioAdapter.OnItemClickListener() {
@Override
public void onItemClick(int item) {
Glide.with(mContext).clear(mLogo);
Glide.with(mContext).load(tags.getStudioLogosLargeFileF().get(item))
.fitCenter().into(mLogo);
List<ScraperImage> scraperImage = tags.getStudioLogos();
ScraperImage clickedImage = (ScraperImage) scraperImage.get(item);
new VideoInfoActivityFragment.ClearLogoSaver(mContext, new VideoInfoActivityFragment()).execute(clickedImage);
}
};
final StudioAdapter studioAdapter = new StudioAdapter(StudioLogoPaths,studioLogoCallback);
studios.setAdapter(studioAdapter);
您需要在界面中添加第二种方法来表示长按事件。然后,在 onBindViewHolder
中,添加 vh.itemView.setOnLongClickListener(...)
,您将在其中调用第二个方法。
编辑:
您的界面现在应该如下所示:
public interface OnItemClickListener {
void onItemClick(int item);
void onItemLongClick(int item);
}
我是这样解决的:
适配器
public class StudioAdapter extends RecyclerView.Adapter<StudioAdapter.StudioViewHolder> {
public interface OnItemClickListener {
void onItemClick(int item);
void onItemLongClick(int position);
}
private List<String> StudioLogoPaths;
private OnItemClickListener listener;
public StudioAdapter(List<String> StudioLogoPaths, OnItemClickListener listener) {
this.StudioLogoPaths = (List<String>) StudioLogoPaths;
this.listener = listener;
}
@Override
public StudioAdapter.StudioViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.studio_logo, parent, false);
StudioViewHolder vh = new StudioViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder( StudioAdapter.StudioViewHolder vh, int position) {
final String path = StudioLogoPaths.get(position);
Glide.with(vh.itemView.getContext()).load(path).into(vh.logoImage);
String basepath = "/data/user/0/org.courville.nova/app_scraper_studiologos/";
String extension = ".png";
final String clicked_studioname = path.replace(basepath, "").replace(extension, "");
final int Position = position;
vh.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(Position);
Toast.makeText(vh.itemView.getContext(), clicked_studioname, Toast.LENGTH_SHORT).show();
}
});
vh.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
listener.onItemLongClick(Position);
return false;
}
});
}
@Override
public int getItemCount() {
return StudioLogoPaths.size();
}
public class StudioViewHolder extends RecyclerView.ViewHolder {
protected ImageView logoImage;
public StudioViewHolder(View itemView) {
super(itemView);
logoImage = itemView.findViewById(R.id.studio_logo);
}
}
}
片段
StudioAdapter.OnItemClickListener studioLogoCallback = new StudioAdapter.OnItemClickListener() {
@Override
public void onItemClick(int item) {
}
@Override
public void onItemLongClick(int position) {
Glide.with(mContext).clear(mLogo);
Glide.with(mContext).load(tags.getStudioLogosLargeFileF().get(position))
.fitCenter().into(mLogo);
ScraperImage clickedImage = (ScraperImage) scraperImage.get(position);
new VideoInfoActivityFragment.ClearLogoSaver(mContext, new VideoInfoActivityFragment()).execute(clickedImage);
}
};