2017-12-18 20 views
4

휴지통에 안드로이드 뷰가 있습니다. ItemTouchHelper을 첨부했습니다. 왼쪽에서 오른쪽으로 만 스 와이프 만 사용하도록 설정했습니다.거리를 벗어난 후 Recycler보기에서 항목을 스 와이프하는 방법

그래서 Recycler보기의 항목을 스 와이프하면 항목이 오른쪽으로 이동하기 시작하고 왼쪽에서 텍스트를 그립니다. 괜찮습니다. 내 요구 사항은 사용자가 특정 거리까지 스 와이프하도록 허용하고 거리에 도달하여 사용자가 터치를 놓으면 스 와이프중인 항목이 다시 왼쪽으로 돌아 가야한다는 것입니다.

왼쪽에서 오른쪽으로 스 와이프하면 화면이 완전히 스 와이프되는 문제가 있습니다. 어떤 거리로만 스 와이프하도록 어떻게 제한 할 수 있습니까? 어떻게해야합니까? 그것은 100에 될 수있는 최대의 x 위치를 설정하고, 다음과

super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 

:

private void initSwipe(){ 
    ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) { 
      @Override 
      public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
       return false; 
      } 

      @Override 
      public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
       int position = viewHolder.getAdapterPosition(); 
      } 

     @Override 
     public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { 
      ViewHolder viewHolder1 = (ViewHolder)viewHolder; 
      int position = viewHolder1.getAdapterPosition(); 
      MyItem item = dataList.get(position); 
      if (item==null)return; 
      if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){ 

       View itemView = viewHolder.itemView; 
       float height = (float) itemView.getBottom() - (float) itemView.getTop(); 
       float width = height/3; 
       Paint p = new Paint(); 
       Paint textPaint = new Paint(); 
       textPaint.setColor(Color.WHITE); 
       textPaint.setTextSize(20); 

       if(dX > 0) { 
        p.setColor(Color.parseColor("#000000")); 
        RectF background = new RectF((float) itemView.getLeft(), (float) itemView.getTop(), dX,(float) itemView.getBottom()); 
        c.drawRect(background,p); 
        //RectF icon_dest = new RectF((float) itemView.getLeft() + width ,(float) itemView.getTop() + width,(float) itemView.getLeft()+ 2*width,(float)itemView.getBottom() - width); 
        //c.drawBitmap(icon,null,icon_dest,p); 
        c.drawText(item.getDate(),(float)(itemView.getLeft() + width),(float)(itemView.getBottom() - width), textPaint); 
       } 
      } 
      super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
     } 
    }; 
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); 
    itemTouchHelper.attachToRecyclerView(myRecycler); 
}` 

답변

0

이 onChildDraw이 라인을 교체 :

다음은 항목을 터치 콜백 내 코드입니다 이 값을 필요에 맞게 조정하십시오. 콜백 핸들러의 onSwiped에서

float newDx = dX; 
if (newDx >= >100f) { 
    newDx = 100f 
} 
super.onChildDraw(c, recyclerView, viewHolder, newDx, dY, actionState, isCurrentlyActive); 

Then

는 RecyclerView 어댑터 notifyItemChanged를 호출합니다.

@Override 
public void onSwiped(RecyclerView.ViewHolder viewHolder, 
    int direction) { 
     if (direction == ItemTouchHelper.RIGHT) { 
     adapter.notifyItemChanged(viewHolder.getAdapterPosition()) 
    } 
} 

notifyItemChanged와 약간의 문제는 원래의 위치의에 뷰를 복원하기 때 짧은 플래시를 알 수 있다는 것입니다.