我在水平griview上实现了RecyclerView OnScrollListener,除了未注册onClick on项目外,它可以按预期工作,实际上,我发现在单击之前必须重复单击项目大约5次,这是因为这些项目是自动滚动的,但是当我没有实现OnScrollListener时却没有发生。 如何按一下项目自动滚动一次并调用onclick?
我的代码如下:
初始化我的RecycleView视图:
RecyclerView recyclerView;
private CustomAdapter_HGV adapter_hgv;
recyclerView = findViewById(R.id.recyclerview);
horizontalLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(horizontalLayoutManager);
adapter_hgv = new CustomAdapter_HGV(this, arrayListString_MainImages_HGV);
adapter_hgv.setClickListener(this);
recyclerView.setAdapter(adapter_hgv);
点击监听器(onCreate)
public void onItemClick(View view, int position) {
Toast.makeText(getApplicationContext(),"Click", Toast.LENGTH_SHORT).show();
}
设置我的适配器:
adapter_hgv = new CustomAdapter_HGV(this, arrayListString_MainImages_HGV);
adapter_hgv.setClickListener(this);
recyclerView.setAdapter(adapter_hgv);
设置我的自动滚动
/*** START HSV AUTO SCROLL***/
final int duration = 10;
final int pixelsToMove = 1;
final Handler mHandler = new Handler(Looper.getMainLooper());
final Runnable SCROLLING_RUNNABLE = new Runnable() {
@Override
public void run() {
recyclerView.smoothScrollBy(pixelsToMove, 0);
mHandler.postDelayed(this, duration);
}
};
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(final RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastItem = horizontalLayoutManager.findLastCompletelyVisibleItemPosition();
if(lastItem == horizontalLayoutManager.getItemCount()-1){
mHandler.removeCallbacks(SCROLLING_RUNNABLE);
Handler postHandler = new Handler();
postHandler.postDelayed(new Runnable() {
@Override
public void run() {
recyclerView.setAdapter(null);
recyclerView.setAdapter(adapter_hgv);
mHandler.postDelayed(SCROLLING_RUNNABLE, 2000);
}
}, 2000);
}
}
});
mHandler.postDelayed(SCROLLING_RUNNABLE, 2000);
/*** END HSV AUTO SCROLL***/
我的自定义RecycleView类:
class CustomAdapter_HGV extends RecyclerView.Adapter {
private ArrayList arrayListString_MainImages_HGV;
private LayoutInflater mInflater;
private ItemClickListener mClickListener;
// data is passed into the constructor
CustomAdapter_HGV(Context context, ArrayList mainImages) {
this.mInflater = LayoutInflater.from(context);
this.arrayListString_MainImages_HGV = mainImages;
}
// inflates the row layout from xml when needed
@Override
@NonNull
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.recyclerview_item, parent, false);
return new ViewHolder(view);
}
// binds the data to the view and textview in each row
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String mainImage = arrayListString_MainImages_HGV.get(position);
Context mContext = holder.ivHorizontalGrid.getContext();
Picasso.with(mContext).load(mainImage).placeholder(R.drawable.loading).error(R.drawable.error).into(holder.ivHorizontalGrid);
}
// total number of rows
@Override
public int getItemCount() {
return arrayListString_MainImages_HGV.size();
}
// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView ivHorizontalGrid;
ViewHolder(View itemView) {
super(itemView);
ivHorizontalGrid = itemView.findViewById(R.id.ivHorizontalGrid);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
}
}
// convenience method for getting data at click position
public String getItem(int id) {
return arrayListString_MainImages_HGV.get(id);
}
// allows clicks events to be caught
public void setClickListener(ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
// parent activity will implement this method to respond to click events
public interface ItemClickListener {
void onItemClick(View view, int position);
}
}