2017-11-05 8 views
0

私は、viewholderエントリがimageviewを持っているrecyclerviewを使用しています。どちらもオンクリックリスナーを持っています。子供の画像ビューがonclickに応答した場合、私はrecylerview onClickがそれに応答しないようにします。クリックされた場所がイメージビューアにない場合、私はrecyclerviewに応答します。これまでの私の研究では、通常、両方のonClickイベントに応答するために同じ関数を使用することでこのような状況を処理できることが示されていますが、recyclerview onclickとその子imageview onClickが異なるという問題があります。彼らは同じ機能でどのように扱うことができないのか分かりません。今私はグローバル変数を使用してイメージビューが既にこのクリックに応答したことを示すためのハッキング回避策を持っており、応答する前にグローバル変数をチェックするためにrecyclerview listenerに200msの遅延を設定しています。これを行うより適切な方法がありますか?子リサーチが既に応答した後、親リサイクラビューのonclickレスポンスをオフにする方法はありますか?

私は、リサイクラビューのすべてのタイプの子ビューに対して「onClick」を追加し、リサイクルビューでリスナーを削除すると、それが機能することに気付きました。私はちょうど2つの子ビューしか持っていません。私はさらに多くを追加する予定ですが、それはまだ管理可能です。より良い方法がないなら、私はおそらくそれを行うだけです。あなたのConstraintLayoutで

<?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); 

      } 

     } 
+0

私は本当にあなたが手動でそのように割り当てない限り、2つの全く異なる見解が最終的に同じonClickListenerを共有して終わることができますどのように表示されません。あなたのコードの一部を共有してもよろしいですか? ViewHolder、アダプタ、レイアウト。 – mradzinski

答えて

0

使用これは:

descendantFocusability="blocksDescendants" 
+0

このキーワードのすべての値を試しましたが、何もしていないようです。画像をクリックすると、まだ2つの操作が行われます。 Patrick

関連する問題