2016-12-24 2 views
-1

Ich muss die Position des Elements in der MotionEvent.ACTION_DOWN abrufen und nach dem Verschieben erhält das Element seine letzte Position (MotionEvent.ACTION_UP). Aber wenn ich im onInterceptTouchEvent Return false schrieb, wird MotionEvent.ACTION_UP nicht aufgerufen. Und wenn ich im onInterceptTouchEvent true schrieb, wurde ACTION_UP aufgerufen, aber die Recycler-View-Ereignisse blockiert.Wie fangen Sie ACTION.MOVE_UP, ohne Recycler zu blockieren Ereignis anzeigen?

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

      if (e.getAction() == MotionEvent.ACTION_UP) { 
       Log.d("Action", "ACTION_UP"); 
       Log.d("view", ((TextView)childView.findViewById(R.id.quest_row_title)).getText().toString()); 

      } 
      if (e.getAction() == MotionEvent.ACTION_DOWN) { 
       Log.d("Action", "ACTION_DOWN"); 
       Log.d("view", ((TextView)childView.findViewById(R.id.quest_row_title)).getText().toString()); 
       Integer count = view.getChildAdapterPosition(childView); 

      } 


      if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 

       mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); 
      } 

      return false; 
     } 


public class PageRecyclerView extends RecyclerView.Adapter<PageRecyclerView.PageViewHolder> implements ItemTouchHelperAdapter { 
    private ArrayList<Page> pages; 
    public static HashMap<Integer, Editable> editable; 

    public PageRecyclerView (ArrayList<Page> pages) 
    { 
     this.pages = pages; 

    } 

    @Override 
    public PageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View addView = LayoutInflater.from(parent.getContext()).inflate(R.layout.page_row, parent, false); 
     return new PageViewHolder(addView); 
    } 

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

     holder.title.setText(pages.get(position).getTitle()); 
     holder.idPage.setText(String.valueOf(pages.get(position).getIdPage())); 
     holder.countSteps.setText(String.valueOf(pages.get(position).getCountSteps())); 
    } 


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

    @Override 
    public void onItemDismiss(int position) { 
     pages.remove(position); 
     notifyItemRemoved(position); 
    } 

    @Override 
    public void onItemMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) { 


     Log.d("Positions moved", "Fromposition"+fromPos+"toPosition"+toPos); 
     Log.d("Positions movedkj", "With id"+((PageViewHolder)viewHolder).idPage.getText().toString()+"toPosition WIth id"+((PageViewHolder)target).idPage.getText().toString()); 
     Integer idFrom = Integer.valueOf(((PageViewHolder)viewHolder).idPage.getText().toString()); 
     Integer idTo= Integer.valueOf(((PageViewHolder)target).idPage.getText().toString()); 
     if((PageViewActivity.editableHashMap.get(idFrom))==null){ 
      PageViewActivity.editableHashMap.put(idTo, new Editable(new Page(idFrom,fromPos), new Page(idTo,toPos))); 
     } 

    } 

    @Override 
    public boolean onItemMove(int fromPosition, int toPosition) { 
     Log.d("Positions", "Fromposition"+fromPosition+"toPosition"+toPosition+"Listsize"+pages.size()); 
     if (fromPosition < toPosition) { 
      for (int i = fromPosition; i < toPosition; i++) { 
       Collections.swap(pages, i, i + 1); 
      } 
     } else { 
      for (int i = fromPosition; i > toPosition; i--) { 
       Collections.swap(pages, i, i - 1); 
      } 
     } 
     notifyItemMoved(fromPosition, toPosition); 
     return true; 
    } 


    public static class PageViewHolder extends RecyclerView.ViewHolder { 
     TextView title; 
     TextView idPage; 
     TextView countSteps; 
     public PageViewHolder(View itemView) { 
      super(itemView); 
      title = (TextView)itemView.findViewById(R.id.page_row_title); 
      idPage = (TextView)itemView.findViewById(R.id.page_row_id_page); 
      countSteps = (TextView)itemView.findViewById(R.id.page_row_count_steps); 
     } 
    } 
} 
+0

was möchten Sie erreichen? es riecht wie ein [XY-Problem] (http://xyproduct.info/) – pskink

+0

Ich habe eine Drag & Drop-Recycler-Ansicht, und ich möchte von der Elementposition vor dem Verschieben, Position nach dem Verschieben (nach MotionEvent.ACTION_UP) erhalten. –

+0

[ItemTouchHelper] (https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.html)? – pskink

Antwort

0

statt

return false; 

versuchen dies zurück und

return view.onInterceptTouchEvent(e); 

diese abfangen werden nicht standardmäßig Touch-Ereignisse

+0

java.lang.StackOverflowError: Stapelgröße 8MB bei android.os.Handler.sendMessageAtTime (Handler.java:600) –

+0

Vielen Dank für die Antwort, aber ich bin immer noch nicht fangen die ACTION_UP java.lang.StackOverflowError: Stackgröße 8MB bei android.os.Handler.sendMessageAtTime (Handler.java: 600) –

0

Dank für die Antwort @pskink, wir müssen sehen, überschreibt zwei Methoden onSelectedChanged (wie ACTION_DOWN) und ClearView (wie ACTION_UP).

@Override 
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 
    // We only want the active item to change 
    if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 
     if (viewHolder instanceof ItemTouchHelperViewHolder) { 
      // Let the view holder know that this item is being moved or dragged 
      ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; 
      itemViewHolder.onItemSelected(); 
      Log.d("onSelectedChanged",((PageRecyclerView.PageViewHolder)itemViewHolder).idPage.getText().toString()); 
      Log.d("onSelectedChanged", String.valueOf(viewHolder.getAdapterPosition())); 
     } 
    } 

    super.onSelectedChanged(viewHolder, actionState); 
} 

@Override 
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
    super.clearView(recyclerView, viewHolder); 

    viewHolder.itemView.setAlpha(ALPHA_FULL); 

    if (viewHolder instanceof ItemTouchHelperViewHolder) { 
     // Tell the view holder it's time to restore the idle state 

     ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; 
     Log.d("onClearView",((PageRecyclerView.PageViewHolder)itemViewHolder).idPage.getText().toString()); 
     itemViewHolder.onItemClear(); 
     Log.d("onClearView","test"); 
     Log.d("onClearView", String.valueOf(viewHolder.getAdapterPosition())); 
    } 
Verwandte Themen