2016-02-20 15 views
5

Ich versuche, eine Schaltfläche zum Löschen hinzufügen, die ein Element in einer Datenbank basierend auf der Position in der RecyclerView löschen soll. Ich kämpfe damit. Hier ist mein Layout-Datei für die RecyclerView:Hinzufügen einer Schaltfläche zum Löschen in einer RecyclerView

<TextView 
    android:id="@+id/layout_list_name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:textStyle="bold" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<TextView 
    android:id="@+id/layout_list_date" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignStart="@+id/layout_list_name" 
    android:layout_alignLeft="@+id/layout_list_name" 
    android:layout_below="@+id/layout_list_name" /> 

<ImageButton 
    android:id="@+id/layout_list_delete" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" 
    android:contentDescription="Delete" 
    android:src="@drawable/icon_layout_delete_layout_item" /> 

Dies ist, wo ich die onItemClick für die ImageButton erklären, die die Löschtaste ist:

imageButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getBaseContext(), "Delete hit!", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

Das ist mein RecyclerView Listener-Klasse:

private OnItemClickListener onItemClickListener; 

public interface OnItemClickListener { 
    void onItemClick(View view, int position); 
} 

GestureDetector gestureDetector; 

public ListsDatabaseItemListener(Context context, OnItemClickListener listener) { 
    onItemClickListener = listener; 
    gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent motionEvent) { 
      return true; 
     } 
    }); 
} 

@Override 
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 
    View view = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY()); 

    if (view != null && onItemClickListener != null && gestureDetector.onTouchEvent(motionEvent)) { 
     onItemClickListener.onItemClick(view, recyclerView.getChildLayoutPosition(view)); 

     return true; 
    } 
    return false; 
} 

@Override 
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 

} 

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

} 

Und schließlich, hier ist meine Adapterklasse:

List<ListsDatabaseList> list; 

public ListsDatabaseListAdapter(List<ListsDatabaseList> list) { 
    this.list = list; 
} 

@Override 
public ListsDatabaseListHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_list, parent, false); 
    ListsDatabaseListHolder holder = new ListsDatabaseListHolder(view); 

    return holder; 
} 

@Override 
public void onBindViewHolder(ListsDatabaseListHolder holder, int position) { 
    holder.name.setText(list.get(position).getName()); 
    holder.date.setText(list.get(position).getDate()); 
} 

@Override 
public int getItemCount() { 
    return list.size(); 
} 

public static class ListsDatabaseListHolder extends RecyclerView.ViewHolder { 
    TextView name; 
    TextView date; 
    ImageButton delete; 

    public ListsDatabaseListHolder(View view) { 
     super(view); 

     this.name = (TextView) view.findViewById(R.id.layout_list_name); 
     this.date = (TextView) view.findViewById(R.id.layout_list_date); 
     this.delete = (ImageButton) view.findViewById(R.id.layout_list_delete); 
    } 
} 

Haben Sie Vorschläge, wie Sie dies erreichen können?

+2

Es ist toll, dass Sie diesen Code zur Verfügung gestellt, und alle, aber was ist Ihre Frage? –

+1

Anstatt den Delete Listener in Aktivität hinzuzufügen, können Sie dies innerhalb des onBindViewHolder in Ihrem Recycler Adapter tun. –

+0

Ich habe meine Frage ganz oben gestellt, aber offensichtlich habe ich mich nicht zu deutlich gemacht. – Razor

Antwort

4

können Sie fügen die ImageButton Klick Zuhörer in Ihrer onBindViewHolder() Methode:

@Override 
public void onBindViewHolder(ListsDatabaseListHolder holder, final int position) { 

    holder.name.setText(list.get(position).getName()); 
    holder.date.setText(list.get(position).getDate()); 

    holder.delete.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       ListsDatabaseList theRemovedItem = list.get(position); 
       // remove your item from data base 
       list.remove(position); // remove the item from list 
       notifyItemRemoved(position); // notify the adapter about the removed item 
      } 
    }); 
} 
+0

Versuchen Sie, das onInterceptTouchEvent Ihrer RecyclerView zu kommentieren, ich denke, es verbraucht das Ereignis. – Rami

+0

Ich habe das versucht. Es verursacht nur, dass meine App abstürzt. Gibt es eine andere Methode? – Razor

+0

Welchen Fehler/welche Ausnahmebedingung erhalten Sie, wenn die App abstürzt? – Rami

Verwandte Themen