我希望建立一个程序,其中有人将点击从文本列表,这将把他们带到另一个活动。
我知道RecyclerView没有像ListView那样的点击监听器,但是经过几次尝试,我还是不能让它工作。
下面是我尝试实现的代码:
MyChatRecyclerViewAdapter.java
public class MyChatRecyclerViewAdapter extends RecyclerView.Adapter<MyChatRecyclerViewAdapter.ViewHolder> {
private final List<Chat> mValues;
private final OnItemClickListener listener;
//private final OnListFragmentInteractionListener mListener;
public MyChatRecyclerViewAdapter(List<Chat> items, OnItemClickListener listener) {
this.mValues = items;
//mListener = listener;
this.listener = listener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fragment_chat, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mItem = mValues.get(position);
holder.mIdView.setText(mValues.get(position).id);
holder.bind(mValues.get(position), listener);
holder.mContentView.setText(mValues.get(position).content);
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != listener) {
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
listener.onListFragmentInteraction(holder.mItem);
}
}
});
}
@Override
public int getItemCount() {
return mValues.size();
}
public interface OnItemClickListener {
//public void onItemClick(View view , int position);
void onItemClick(Chat item);
}
public class ViewHolder extends RecyclerView.ViewHolder{
public final View mView;
public final TextView mIdView;
public final TextView mContentView;
public Chat mItem;
OnItemClickListener mItemClickListener;
/*@Override
public void onClick(View v) {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(v, getPosition());
}
}*/
public ViewHolder(View itemView) {
super(itemView);
mView = itemView;
mIdView = (TextView) itemView.findViewById(R.id.id);
mContentView = (TextView) itemView.findViewById(R.id.content);
}
public void bind(final Chat item, final OnItemClickListener listener){
itemView.setOnClickListener(new View.OnClickListener(){
@override
public void onClick(View v){
listener.onItemClick(item);
}
});
}
@Override
public String toString() {
return super.toString() + " '" + mContentView.getText() + "'";
}
}
}发布于 2017-03-10 23:17:00
在RecyclerView中,视图被回收以提高性能。你不应该把OnClickListener放在onBindViewHolder里面,因为它的位置并不总是正确的。尝试将OnClickListener移动到ViewHolder的构造函数中,并通过调用getAdapterPosition()来获取当前位置:
public ViewHolder(View itemView) {
super(itemView);
mView = itemView;
mIdView = (TextView) itemView.findViewById(R.id.id);
mContentView = (TextView) itemView.findViewById(R.id.content);
mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int position = getAdapterPosition();
if (null != listener) {
listener.onListFragmentInteraction(mValues.get(position));
}
}
});
}发布于 2017-03-10 23:16:30
在您的MyChatRecyclerViewAdapter中添加以下方法:
public void setClickListener(OnItemClickListener listener) {
this.listener = listener;
}并调用
mAdapter.setClickListener(new MyChatRecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(Chat chat) {
}
});来自您的活动/片段类
发布于 2017-03-10 23:19:57
您正在设置onclick listener 2次。1在onBind()中,1在视图控制符中。
从绑定()和视图持有者中删除,使用侦听器对象将事件传递给特定的侦听器。
Layout.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
if (getListener() != null) {
getListener().onLayoutClick(view, this.getAdapterPosition());
}
}
});https://stackoverflow.com/questions/42721571
复制相似问题