Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么RecyclerView.OnScrollListener()只影响RecyclerView的最后一项_Java_Android_Android Recyclerview - Fatal编程技术网

Java 为什么RecyclerView.OnScrollListener()只影响RecyclerView的最后一项

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

我想在我的应用程序中使用此功能

这意味着当滚动ever RecyclerView时,显示时间的文本视图应该在一小段时间后显示,我的努力是这样的,目标文本视图已经Visibly.Goe,适配器看起来像

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);
    }       

}