好的,这是交易。我昨天浪费了13个小时来处理ListView上的点击处理,然后切换到RecyclerView(感谢这里的成员)解决了处理项目点击的原始问题。我是Android编程的新手,所以请耐心等待。
我设法使用RecyclerView \ RecyclerItemClickListener解决了我的问题:
现在,我添加了一些我想要使用的按钮,这使事情变得复杂。我希望能够点击按钮并执行各种操作,同时单击主项目并执行其他操作。有没有办法扩展RecyclerItemClickListener,以允许我检查点击是否在按钮或Recycler项目本身。我发现RecyclerItemClickListener上有坐标。所以,我想我也许可以用它来确定被点击的控件,但我记得设备有不同的屏幕尺寸。
我已经看到一些方法来处理ViewHolder级别的点击,但我想检查按钮和项目本身。我一直在搜索,我决定使用我的布局来指定布局标签上的onclick元素以及布局上的每个元素,将非按钮元素转发到项目(布局标签)方法,同时为按钮提供单独的方法
我正在做什么黑客攻击?你能指出我完成我想要的正确方向吗?
答案 0 :(得分:1)
您可以在ViewHolder
:
class MyViewHolder extends RecyclerView.ViewHolder {
private Button myButton;
public MyViewHolder(View itemView) {
super(itemView);
myButton = itemView.findViewById(R.id.my_button);
itemView.setOnClickListener(mainViewClickListener);
myButton.setOnClickListener(buttonClickListener);
}
private View.OnClickListener mainViewClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do main thing here.
}
};
private View.OnClickListener buttonClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do button click handling here
}
};
}
答案 1 :(得分:1)
您可以使用Facade视图来处理此问题。通过在LinearLayout中创建LinearLayout,您可以选择处理点击次数的内容。因此,如何处理长时间点击setOnCreateContextMenuListener
,点击视图中的项目进行短暂点击和点击。
这是一个示例布局,请注意可聚焦/可点击的参数。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/showClickable"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
>
<TextView
android:text="TextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/itemShowTitle"
android:layout_weight="1"
/>
<Button
android:id="@+id/buttonWorthClicking"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button worth clicking"/>
</LinearLayout>
</LinearLayout>
然后我们需要传递的ViewHolder或根据需要处理点击
public class ShowsRecyclerViewAdapter extends RecyclerView.Adapter<ShowsRecyclerViewAdapter.ViewHolder> {
public ShowsRecyclerViewAdapter(List<Show> shows) {
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.show_list_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemShowTitle.setText("" + position);
}
@Override
public int getItemCount() {
return 10;
}
static class ViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnCreateContextMenuListener {
final TextView itemShowTitle;
final Button buttonWorthClicking;
ViewHolder(final View itemView) {
super(itemView);
itemView.setOnClickListener(this);
itemShowTitle = (TextView) itemView.findViewById(R.id.itemShowTitle);
buttonWorthClicking = (Button) itemView.findViewById(R.id.buttonWorthClicking);
setViewFacade(itemView);
itemView.setOnCreateContextMenuListener(this);
}
/**
* Because the layout is nested to for the ripple we build a facade to pass along clicks
*/
private void setViewFacade(final View itemView) {
View facedForClicks = itemView.findViewById(R.id.showClickable);
facedForClicks.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// pass along the short click
ViewHolder.this.onClick(itemView);
}
});
facedForClicks.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
// no-op but passes up to the ViewHolder
}
});
buttonWorthClicking.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("one-off", "the button was clicked");
}
});
}
@Override
public void onClick(View v) {
Log.d("one-off", "short click on item");
}
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
Log.d("one-off", "long click on item");
}
}
}
我在github上的Podcast播放器项目上创建了一个分支,你可以看到一个有效的例子。