android - OnClickListener无法在recyclerview中首次点击

时间:2017-09-18 22:28:28

标签: java android android-recyclerview onclicklistener

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

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

这是我的适配器:

tmux

当前的onClick有效但我必须在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(); } } 上单击两次才能触发onClick。为了解决这个问题,我一直在寻找和尝试3天无休止的解决方案,但到目前为止,互联网上的解决方案都没有奏效。

4 个答案:

答案 0 :(得分:9)

确保您同时拥有focusableInTouchMode&amp;按钮上已禁用focusable。第一次单击将获得焦点,第二次单击将执行onClickListener。

答案 1 :(得分:0)

滚动后,无法单击“回收者视图”项目,问题仍然存在https://issuetracker.google.com/issues/66996774

找到了一种在滚动状态仍为SCROLL_STATE_SETTLING时强制单击的方法

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

答案 2 :(得分:0)

以下类将解决此问题:

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

答案 3 :(得分:0)

对我而言 focusableInTouchMode 和 focusable 不起作用。

将此行添加到 RecyclerView :

android:nestedScrollingEnabled="false"

享受¡