Java 为什么RecyclerView.OnScrollListener()只影响RecyclerView的最后一项
我想在我的应用程序中使用此功能 这意味着当滚动ever RecyclerView时,显示时间的文本视图应该在一小段时间后显示,我的努力是这样的,目标文本视图已经Visibly.Goe,适配器看起来像Java 为什么RecyclerView.OnScrollListener()只影响RecyclerView的最后一项,java,android,android-recyclerview,Java,Android,Android Recyclerview,我想在我的应用程序中使用此功能 这意味着当滚动ever RecyclerView时,显示时间的文本视图应该在一小段时间后显示,我的努力是这样的,目标文本视图已经Visibly.Goe,适配器看起来像 public class ChatMessageAdapter extends RecyclerView.Adapter<ViewHolder> { private List<ChatMessage> mMessageList; private Conte
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);
}
}
公共类ChatMessageAdapter扩展了RecyclerView.Adapter{
私人传道者名单;
私有上下文;
私有布尔isMe=false;
私人信息持有人;
公共ChatMessageAdapter(上下文mContext、列表mMessageList){
this.mContext=mContext;
this.mMessageList=mMessageList;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View rootView=LayoutInflater.from(mContext).充气(R.layout.chat\u them\u container,parent,false);
返回新的消息持有者(rootView);
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
消息持有者=(消息持有者)持有者;
messageHolder.mmessagetexview.setText(mMessageList.get(position.getMessage());
messageHolder.msentatextview.setText(mMessageList.get(position.getSentAt());
}
@凌驾
public int getItemCount(){
返回mMessageList.size();
}
显示和隐藏的公共无效(){
messageHolder.msentatextview.setVisibility(View.VISIBLE);
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
messageHolder.msentatextview.setVisibility(View.GONE);
}
},3500);
}
}
在主要活动中,我只是
@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);
}
});
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMessageList=new CopyOnWriteArrayList();
mChatMessagesRecyclerView=(RecyclerView)findViewById(R.id.chat\u msg\u rv);
mChatMessagesRecyclerView.setLayoutManager(新的LinearLayoutManager(MainActivity.this));
mChatMessageAdapter=新的ChatMessageAdapter(MainActivity.this,mMessageList);
mChatMessagesRecyclerView.setAdapter(mChatMessageAdapter);
mChatMessagesRecyclerView.setOnScrollListener(新的RecyclerView.OnScrollListener(){
@凌驾
CrollStateChanged上的公共无效(RecyclerView RecyclerView,int newState){
super.onScrollStateChanged(recyclerView、newState);
mChatMessageAdapter.showAndHideDate();//这里我调用适配器类中定义的方法
}
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
}
});
}
通过上面的代码,我只在RecyclerView的最后一项上获得了所需的效果,如图所示
如何在RecyclerView的所有项目上应用所需的效果?问题是,您在适配器中只使用了一个
TheMessageHolder
变量。也就是说,每次调用onBindViewHolder()
都会覆盖该变量。然后,messageHolder
将指向最后创建的holder,而shownandhideDate()
将仅对其起作用
解决方案是找到所有可见的持有者(伪代码):
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(initChatBarUI()){
mSendImageButton.setOnClickListener(MainActivity.this);
mEmoImageButton.setOnClickListener(MainActivity.this);
}
mMessageList=new CopyOnWriteArrayList();
最终LinearLayoutManager layoutManager=新的LinearLayoutManager(MainActivity.this);
mChatMessagesRecyclerView=(RecyclerView)findViewById(R.id.chat\u msg\u rv);
mChatMessagesRecyclerView.setLayoutManager(layoutManager);
mChatMessageAdapter=新的ChatMessageAdapter(MainActivity.this,mMessageList);
mChatMessagesRecyclerView.setAdapter(mChatMessageAdapter);
mChatMessagesRecyclerView.setOnScrollListener(新的RecyclerView.OnScrollListener(){
@凌驾
CrollStateChanged上的公共无效(RecyclerView RecyclerView,int newState){
super.onScrollStateChanged(recyclerView、newState);
final int firstVisibleItemPosition=layoutManager.findFirstVisibleItemPosition();
final int lastVisibleItemPosition=layoutManager.findLastVisibleItemPosition();
mChatMessageAdapter.showAndHideDate(mChatMessagesRecyclerView,firstVisibleItemPosition,lastVisibleItemPosition);//这里我调用适配器类中定义的方法
}
@凌驾
已填空的公共空间(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);
}
}
public void show and hiddedate(RecyclerView mRecyclerView、int firstVisibleItemPosition、int lastVisibleItemPosition){
对于(int i=firstVisibleItemPosition;i而言,问题在于您在适配器中只使用了一个TheMessageHolder
变量。这意味着,它的变量在每次调用onBindViewHolder()
时都会被覆盖。然后,messageHolder
将指向最后创建的holder,并且showAndHideDate()
仅适用于它
解决方案是找到所有可见的持有者(伪代码):
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(initChatBar)
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);
}
}