2016-02-20 13 views
5

Sto tentando di aggiungere un pulsante Elimina che dovrebbe eliminare un elemento in un database in base alla posizione che ha nel RecyclerView. Sto lottando con questo. Ecco il mio file di layout per la RecyclerView:Aggiungere un pulsante Elimina in un 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" /> 

Questo è dove dichiaro la onItemClick per la ImageButton che è il tasto di cancellazione:

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

Questa è la mia classe RecyclerView ascoltatore:

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) { 

} 

E infine, ecco la mia classe adattatore:

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

Qualche suggerimento su come raggiungere questo obiettivo?

+2

E 'grande che hai fornito questo codice, e tutto, ma qual è la tua domanda? –

+1

invece di aggiungere il listener di eliminazione in attività, è possibile farlo all'interno di onBindViewHolder nell'adattatore Recycler. –

+0

Ho fatto la mia domanda in cima, ma ovviamente non mi sono reso chiaro. – Razor

risposta

4

è possibile aggiungere il ImageButton click ascoltatore nel metodo onBindViewHolder():

@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

Prova a commentare l'onInterceptTouchEvent del tuo RecyclerView, penso che consuma l'evento. – Rami

+0

L'ho provato. Fa sì che la mia app si arresti in modo anomalo. C'è qualche altro metodo? – Razor

+0

Quale errore/eccezione si ottiene quando l'app si arresta in modo anomalo? – Rami