2015-07-05 5 views
8

Ich baue eine einfache Recyclerview mit benutzerdefinierten Layout (Textansicht und Schalter) und einen benutzerdefinierten Adapter.Handle Touch-Ereignis für Artikel in Recyclerview - Android

Mein Problem ist, dass ich nicht mit dem Click-Ereignis für den Schalter umgehen kann (was es seinen Status wechseln), ich habe einen Touch-Listener für die Recyclerview gebaut und es wird jedes Mal ausgelöst, wenn ich auf den Schalter klicke.

Nach vielen Versuchen wird auch der Schalter touch listener ausgelöst, aber ich möchte das Touch-Ereignis für die recyclerView deaktivieren, wenn der Schalter angeklickt wird.

Hier ist mein Layout-Code:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="60.0dip" 
android:layout_weight="1.0" 
android:orientation="horizontal" 
android:paddingLeft="16dp"> 

<TextView 
    android:id="@+id/category_name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="false" 
    android:layout_centerVertical="true" 
    android:layout_gravity="center_vertical" 
    android:text="Category Name" 
    android:textAppearance="?android:textAppearanceLarge" /> 

<android.support.v7.widget.SwitchCompat 
    android:id="@+id/category_switch" 
    android:layout_width="80dp" 
    android:layout_height="wrap_content" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" 
    android:layout_gravity="center_vertical" 
    android:checked="true" 
    android:clickable="true" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:paddingRight="16dp" /> 

</RelativeLayout> 

dies mein Adapter-Code ist:

public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View row = layoutInflater.inflate(R.layout.single_row_category, parent, false); 
    CategoryViewHolder holder = new CategoryViewHolder(row); 

    return holder; 
} 

public void onBindViewHolder(CategoryViewHolder holder, final int position) { 
    AlarmCategory thisCat = categories.get(position); 

    holder.catName.setText(thisCat.getCategoryName()); 

    holder.catStatus.setChecked(thisCat.isOn()); 

    holder.catStatus.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      Log.d("fpp", view.getClass().getName() + " is clicked"); 
      return true; 
     } 
    }); 
} 

public class CategoryViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener { 

    public TextView catName; 
    public SwitchCompat catStatus; 

    public CategoryViewHolder(View itemView) { 
     super(itemView); 
     itemView.setOnCreateContextMenuListener(this); 

     catName = (TextView) itemView.findViewById(R.id.category_name); 
     catStatus = (SwitchCompat) itemView.findViewById(R.id.category_switch); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) { 
     menu.add(0, 1001, 0, "Edit");//groupId, itemId, order, title 
     menu.add(0, 1002, 1, "Delete"); 
    } 
} 

Und hier ist Handler meine recyclerView touch:

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 = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
     if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { 
      clickListener.onClick(child, rv.getChildPosition(child)); 

      Log.d("fpp", child.getClass().getName() + " is clicked"); 

      return false; 
     } 

     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { 

    } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

    } 
} 

und in der onCreate Methode i rufen Sie es durch:

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, recyclerView, new ClickListener() { 
     @Override 
     public void onClick(View view, int position) { 
      Intent i = new Intent(CategoriesList.this, AlarmList.class); 
      i.putExtra("catID", categories.get(position).getCategoryID()); 
      startActivity(i); 
     } 

     @Override 
     public void onLongClick(View view, int position) { 
      catPos = position; 
     } 
    })); 

Irgendwelche Hilfe bitte, ich habe bereits viele Lösungen ausprobiert, aber nichts hat geholfen.

Vielen Dank im Voraus.

Antwort

7

Eine Möglichkeit besteht darin, Ihren Inhaber zu aktualisieren, damit er intern alle Blickklicks behandelt, z.

public class CategoryViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener, View.OnClickListener, CompoundButton.OnSetCheckedListener { 
    public CategoryViewHolder(View itemView) { 
     super(itemView); 
     itemView.setOnCreateContextMenuListener(this); 
     itemView.setOnClickListener(this); 

     catName = (TextView) itemView.findViewById(R.id.category_name); 
     catStatus = (SwitchCompat) itemView.findViewById(R.id.category_switch); 
     catStatus.setOnCheckChangedListener(this); 
    } 

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     // deal with catStatus change 
    } 

    public void onClick(View view) { 
     // deal with itemView click 
    } 
} 
+0

Vielen Dank für Ihre Antwort, aber ich schrieb diesen Code und fügte hinzu, 'Log.d ("Fopp", view.getClass() getName() + "von inneren geklickt wird."),' Aber nichts geschah Entschuldigung – Fareed

+0

Sie verwenden einen Gesten-Detektor, der das Berührungsereignis stiehlt und für nichts anderes propagiert wird. Der Code in der Antwort funktioniert, aber dafür müssen Sie entfernen 1) 'recyclerView.addOnItemTouchListener()' Teil und 2) die Gestenerkennung –

+0

und wie das Touch-Ereignis auf dem Layout selbst zu behandeln? Ich möchte zu einer anderen Aktivität navigieren, wenn auf alles außer dem Schalter geklickt wird. – Fareed

Verwandte Themen