[英]why RecyclerView.OnScrollListener() affects on only last item of recyclerview
我想在我的應用程序中擁有此功能
意味着每當RecyclerView滾動時,顯示時間的TextView就會出現一小段時間,然后消失,我的工作就是這樣,目標TextView具有Visiblity.GONE和適配器看起來像
public class ChatMessageAdapter extends RecyclerView.Adapter<ViewHolder> {
private List<ChatMessage> mMessageList;
private Context mContext;
private boolean isMe = false;
private ThemMessageHolder messageHolder;
public ChatMessageAdapter(Context mContext, List<ChatMessage> mMessageList){
this.mContext = mContext;
this.mMessageList = mMessageList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(mContext).inflate( R.layout.chat_them_container, parent, false );
return new ThemMessageHolder(rootView);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
messageHolder = (ThemMessageHolder) holder;
messageHolder.mMessageTextView.setText(mMessageList.get(position).getMessage());
messageHolder.mSentAtTextView.setText(mMessageList.get(position).getSentAt());
}
@Override
public int getItemCount() {
return mMessageList.size();
}
public void showAndHideDate(){
messageHolder.mSentAtTextView.setVisibility(View.VISIBLE);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
messageHolder.mSentAtTextView.setVisibility(View.GONE);
}
},3500);
}
}
在MainActivity中,我只是
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMessageList = new CopyOnWriteArrayList<>();
mChatMessagesRecyclerView = (RecyclerView) findViewById(R.id.chat_msg_rv);
mChatMessagesRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
mChatMessageAdapter = new ChatMessageAdapter(MainActivity.this, mMessageList);
mChatMessagesRecyclerView.setAdapter(mChatMessageAdapter);
mChatMessagesRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
mChatMessageAdapter.showAndHideDate(); // Here I'm calling the method defined in Adapter class
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
}
通過上面的代碼,我僅對RecyclerView的最后一項獲得了預期的效果,如圖所示
如何在RecyclerView的所有項目上應用所需的效果?
問題是您在適配器中僅使用一個ThemMessageHolder
變量。 意味着,每次onBindViewHolder()
調用都會覆蓋該變量。 然后, messageHolder
將指向最后創建的所有者,而showAndHideDate()
將僅與它一起使用。
該解決方案可以找到所有可見的持有人(偽代碼):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (initChatBarUI()){
mSendImageButton.setOnClickListener(MainActivity.this);
mEmoImageButton.setOnClickListener(MainActivity.this);
}
mMessageList = new CopyOnWriteArrayList<>();
final LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
mChatMessagesRecyclerView = (RecyclerView) findViewById(R.id.chat_msg_rv);
mChatMessagesRecyclerView.setLayoutManager(layoutManager);
mChatMessageAdapter = new ChatMessageAdapter(MainActivity.this, mMessageList);
mChatMessagesRecyclerView.setAdapter(mChatMessageAdapter);
mChatMessagesRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
final int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
final int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
mChatMessageAdapter.showAndHideDate(mChatMessagesRecyclerView, firstVisibleItemPosition, lastVisibleItemPosition); // Here I'm calling the method defined in Adapter class
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
}
和showAndHideDate()可能看起來像
public void showAndHideDate(RecyclerView mRecyclerView, int firstVisibleItemPosition, int lastVisibleItemPosition){
for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; ++i) {
final ThemMessageHolder holder = (ThemMessageHolder) mRecyclerView.findViewHolderForAdapterPosition(i);
holder.mSentAtTextView.setVisibility(View.VISIBLE);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
holder.mSentAtTextView.setVisibility(View.GONE);
}
},3500);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.