如何在子视图已响应后关闭父回收站视图onclick响应?

时间:2017-11-05 23:32:20

标签: android android-recyclerview onclicklistener

我正在使用recyclelerview,其中viewholder条目具有imageview。两者都有一个onclick监听器。如果子图像视图响应onclick,我不希望recylerview onClick响应它。如果点击的位置不在imageviewer上,我希望recyclerview能够做出响应。到目前为止,我的研究表明,通常可以通过使用相同的函数来响应onClick事件来处理这种情况,但问题是recyclelerview onclick和它的子imageview onClick是不同的。我不知道如何在同一个函数中处理它们。现在我有一个黑客解决方法来使用全局变量来指示imageview已经响应了这个点击,并在recyclelerview监听器上设置了200ms的延迟,以便在响应之前检查全局变量。有没有更合适的方法呢?

我刚注意到,如果我为Recycler视图的每种类型的子视图添加“onClick”并删除recyclerview上的侦听器,那就可以了。现在我无论如何只有两个孩子的观点。虽然我会添加更多,但它仍然可以管理。如果没有更好的方法,我可能会这样做。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:paddingLeft="16dp"
android:paddingRight="4dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:clickable="true"
android:background="?android:attr/selectableItemBackground"
android:orientation="vertical">

<TextView
    android:id="@+id/lstItemName"
    android:textColor="@color/title"
    android:textSize="16dp"
    android:textStyle="bold"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/lstItemReportby"
    android:layout_gravity="left"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    />


<ImageView
    android:id="@+id/lstItemMap"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginRight="2dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"/>
</android.support.constraint.ConstraintLayout>


public class TrackedItemListAdapter extends RecyclerView.Adapter<TrackedItemListAdapter.MyViewHolder>{

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView m_itemName, m_itemDes, m_itemReportedBy, m_itemHiddenText;
    public ImageView m_itemMapDrop;


    public MyViewHolder(View view) {
        super(view);
        m_itemName = (TextView) view.findViewById(R.id.lstItemName);
        m_itemMapDrop = (ImageView) view.findViewById(R.id.lstItemMap);
    }
}
@Override
public void onBindViewHolder(TrackedItemListAdapter.MyViewHolder holder, int position) {
        holder.m_itemName.setText(obj.getName());
        holder.m_itemMapDrop.setImageResource(R.drawable.ic_img_nomap);

        holder.m_itemMapDrop.setOnClickListener(new View.OnClickListener() {
            //@Override
            public void onClick(View v) {
                startMap();
            }
        });
    }
}


m_trackedItemListAdapter = new TrackedItemListAdapter();
    m_recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    m_recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    m_recyclerView.setLayoutManager(mLayoutManager);
    m_recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
    m_recyclerView.setItemAnimator(new DefaultItemAnimator());
        m_recyclerView.setAdapter(m_trackedItemListAdapter);
            m_recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), m_recyclerView, new RecyclerTouchListener.ClickListener() {
        @Override
        public void onClick(View view, int position) {


                //a hack to turn off response if the imageview for location already responded
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        popupItemContent();
                    }
                }, 200);

            }

        }

1 个答案:

答案 0 :(得分:0)

在ConstraintLayout中使用它:

descendantFocusability="blocksDescendants"