我的主要活动(包含RecyclerView的活动)如下所示:
myList = (RecyclerView) findViewById(R.id.my_list);
myAdapter = new MyAdapter(this, getData());
myList.setAdapter(myAdapter);
myList.setLayoutManager(new LinearLayoutManager(this));
然后我有一个MyViewHolder,
public class MyViewHolder extends RecyclerView.ViewHolder {
...
public Button addButton;
public View root;
public MyViewHolder(View itemView) {
super(itemView);
...
addButton = (Button) itemView.findViewById(R.id.add_button);
root = itemView;
}
...
}
然后是适配器
public class MyAdapter extends RecyclerView.Adapter <MyViewHolder>{
private LayoutInflater myInflater;
List<MyModel> data = Collections.emptyList();
Context context;
public MyAdapter (Context context, List<MyModel> data) {
myInflater = LayoutInflater.from(context);
this.data = data;
this.context = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = myInflater.inflate(R.layout.my_item, parent, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
...
holder.addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("Hello", "Added");
}
});
holder.root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("Hello", "Rooted");
}
});
}
...
}
从上面可以看出,我有一个RecyclerView项目,它有一个按钮作为孩子。在单击childButton时,onClickListener正常工作,我打印出Added
。但当我点击整个项目(根)时,没有任何反应。为什么root onClickListener不起作用?
我是Android的真正初学者,所以我不确定我哪里出错了。
my_item.xml
看起来像:
<LinearLayout>
<RelativeLayout
android:clickable="true"> <-- this is the problem as correctly pointed out by user13
<RelativeLayout>
<TextView>
<LinearLayout>
<TextView>
<TextView>
<TextView>
</LinearLayout>
</RelativeLayout>
<RelativeLayout>
<Button>
<Button>
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
答案 0 :(得分:2)
您可能需要将以下属性添加到 my_item.xml 中的根kurt@kurt-ThinkPad:~$ netstat -a | grep 8080
kurt@kurt-ThinkPad:~$
:
LinearLayout
答案 1 :(得分:0)
您需要添加onTouch
侦听器,在项目中添加以下内容
ClickListener.java
public interface ClickListener {
void onClick(View view, int position);
void onLongClick(View view, int position);
}
RecyclerTouchListener .java
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
private GestureDetector gestureDetector;
private ClickListener clickListener;
public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
this.clickListener = clickListener;
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null) {
clickListener.onLongClick(child, recyclerView.getChildPosition(child));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
clickListener.onClick(child, rv.getChildPosition(child));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
现在你设置适配器的地方就像这样使用这个类
myList .addOnItemTouchListener(new RecyclerTouchListener(this, myList , new ClickListener() {
@Override
public void onClick(View view, int position) {
//do your stuff on click
}
@Override
public void onLongClick(View view, int position) {
//do your stuff on ling click
}
}));
}