Java android-OnClickListener在recyclerview中第一次单击时不工作
我正在Android的聊天应用程序中工作,我正在使用RecyclerView列出消息 我已经编写了适配器,但是我在检测布局中的元素(本例中为TextView)何时被单击时遇到了问题 这是我的适配器:Java android-OnClickListener在recyclerview中第一次单击时不工作,java,android,android-recyclerview,onclicklistener,Java,Android,Android Recyclerview,Onclicklistener,我正在Android的聊天应用程序中工作,我正在使用RecyclerView列出消息 我已经编写了适配器,但是我在检测布局中的元素(本例中为TextView)何时被单击时遇到了问题 这是我的适配器: public class ChatRoomThreadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private class ViewHolder extends RecyclerView.Vi
public class ChatRoomThreadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private class ViewHolder extends RecyclerView.ViewHolder {
TextView message, timestamp;
private ViewHolder(View view) {
super(view);
message = (TextView) itemView.findViewById(R.id.message);
timestamp = (TextView) itemView.findViewById(R.id.timestamp);
}
}
public ChatRoomThreadAdapter(Context mContext, ArrayList<Message> messageArrayList, String userId) {
this.mContext = mContext;
this.messageArrayList = messageArrayList;
this.userId = userId;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView;
itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
((ViewHolder) holder).message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (((ViewHolder) holder).timestamp.getVisibility() == View.GONE) {
((ViewHolder) holder).timestamp.setVisibility(View.VISIBLE);
} else {
((ViewHolder) holder).timestamp.setVisibility(View.GONE);
}
}
});
}
@Override
public int getItemCount() {
return messageArrayList.size();
}
}
公共类聊天室线程适配器扩展了RecyclerView.Adapter{
私有类ViewHolder扩展了RecyclerView.ViewHolder{
TextView消息,时间戳;
私有视图持有者(视图){
超级(视图);
message=(TextView)itemView.findViewById(R.id.message);
timestamp=(TextView)itemView.findViewById(R.id.timestamp);
}
}
公共聊天室线程适配器(上下文mContext、ArrayList messageArrayList、字符串userId){
this.mContext=mContext;
this.messageArrayList=messageArrayList;
this.userId=userId;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
查看项目视图;
itemView=LayoutFlater.from(parent.getContext()).flate(R.layout.chat,parent,false);
返回新的ViewHolder(itemView);
}
@凌驾
public void onBindViewHolder(final RecyclerView.ViewHolder,int位置){
((ViewHolder)holder.message.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
if(((ViewHolder)holder.timestamp.getVisibility()==View.GONE){
((ViewHolder)holder.timestamp.setVisibility(View.VISIBLE);
}否则{
((ViewHolder)holder.timestamp.setVisibility(View.GONE);
}
}
});
}
@凌驾
public int getItemCount(){
返回messageArrayList.size();
}
}
当前onClick可以工作,但我必须在
消息上单击两次才能触发onClick。为了解决这个问题,我已经搜索并尝试了3天的无休止的解决方案,但到目前为止,互联网上的任何解决方案都没有奏效 确保按钮上同时禁用了focusableintouch模式
和focusableintouch模式
。第一次单击将获得焦点,第二次单击将执行onClickListener
滚动后,无法单击“回收者视图”项目,问题仍然存在
找到了一种在滚动状态仍为滚动状态时强制单击的方法
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.recyclerview.widget.RecyclerView
class WrapperRecyclerView(context: Context, attributeSet: AttributeSet?, defStyle: Int) :
RecyclerView(context, attributeSet, defStyle) {
constructor(context: Context) : this(context, null, 0)
constructor(context: Context, attributeSet: AttributeSet) : this(context, attributeSet, 0)
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
val eventConsumed = super.onInterceptTouchEvent(event)
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> if (scrollState == SCROLL_STATE_SETTLING) {
parent.requestDisallowInterceptTouchEvent(false)
// only if it touched the top or the bottom.
if (!canScrollVertically(-1) || !canScrollVertically(1)) {
// stop scroll to enable child view to get the touch event
stopScroll()
// do not consume the event
return false
}
}
}
return eventConsumed
}
}
以下类将修复此问题:
class WrapperRecyclerView(context: Context, attributeSet: AttributeSet?, defStyle: Int) :
RecyclerView(context, attributeSet, defStyle) {
constructor(context: Context) : this(context, null, 0)
constructor(context: Context, attributeSet: AttributeSet) : this(context, attributeSet, 0)
override fun onScrollStateChanged(state: Int) {
super.onScrollStateChanged(state)
if (state == RecyclerView.SCROLL_STATE_SETTLING) {
this.stopScroll();
}
}
}
您是否已登录以查看onClick
是否实际同时发生,但视图的可见性实际上只工作一次。另外,时间戳
视图的原始可见性是什么?如果不可见
而不是消失了
,这就说明了你看到了什么。首先单击将其设置为消失
(看起来好像什么都没有发生),然后第二次单击将其设置为可见
。再次单击仅发生一次。我已将其记录。我已通过将其设置为false将其禁用;此外,我还尝试删除它,但仍然需要双击onClick来触发尝试禁用“focusable”属性。我正在我的IDE中测试它,我知道我以前必须禁用这两个功能。我的测试按钮在一个片段中工作,两个都被禁用。