Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.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 android-OnClickListener在recyclerview中第一次单击时不工作_Java_Android_Android Recyclerview_Onclicklistener - Fatal编程技术网

Java android-OnClickListener在recyclerview中第一次单击时不工作

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

我正在Android的聊天应用程序中工作,我正在使用RecyclerView列出消息

我已经编写了适配器,但是我在检测布局中的元素(本例中为TextView)何时被单击时遇到了问题

这是我的适配器:

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中测试它,我知道我以前必须禁用这两个功能。我的测试按钮在一个片段中工作,两个都被禁用。