2016-10-25 16 views
0

私はコードを実行するとonItemTouchHelperとコールバックメソッドを実装する方法についてチュートリアルhereに従っています。私は、リスト内の他の項目の一つを過ぎて移動します。私のアプリは、範囲外のインデックスで強制的に閉じることになります。私もItemTouchHelperAdapterを持ってここに正しい方法でアンドロイドのrecyclerviewにアイテムのタッチヘルパーを実装する

は私のコードですが、それはチュートリアルのコードと同じですが、

シンプルなアイテムのタッチヘルパーのコールバック

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback 
{ 

private final predictsCardAdapter mAdapter; 

public SimpleItemTouchHelperCallback(predictsCardAdapter adapter){ 
    mAdapter = adapter; 
} 

@Override 
public boolean isLongPressDragEnabled(){ 
    return true; 
} 
@Override 
public boolean isItemViewSwipeEnabled(){ 
    return false; 
} 

@Override 
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
    int dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; 
    int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; 

    return makeMovementFlags(dragFlags,swipeFlags); 
} 

@Override 
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
    mAdapter.onItemMove(viewHolder.getAdapterPosition(), 
    target.getAdapterPosition()); 
    //mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), 
    //target.getAdapterPosition()); 
    return true; 
} 

@Override 
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
// mAdapter.onItemDismiss(viewHolder.getAdapterPosition()); 
} 
} 

HERESに私のアダプタ

public class predictsCardAdapter extends 
RecyclerView.Adapter<predictsCardAdapter.MyViewHolder> implements  
ItemTouchHelperAdapter{ 
private List<addNewCard> cardMakerList; 

@Override 
public boolean onItemMove(int fromPosition, int toPosition) { 
    if (fromPosition < toPosition){ 
     for (int i = fromPosition; i < toPosition; i++){ 
      Collections.swap(cardMakerList,i,i+1); 
     } 
    }else{ 
     for (int i = fromPosition; i > toPosition; i--){ 
      Collections.swap(cardMakerList,i,i-1); 
     } 
    } 
    notifyItemMoved(fromPosition,toPosition); 
    return true; 
} 

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

public class MyViewHolder extends RecyclerView.ViewHolder{ 
    public TextView cardText, speechText; 
    public ImageView cardImage; 
    public ContentLoadingProgressBar progress; 

    public MyViewHolder(View view){ 
     super(view); 
     cardText = (TextView) view.findViewById(R.id.predictscardText); 
     speechText = (TextView) view.findViewById(R.id.predictsspeechText); 
     cardImage = (ImageView) view.findViewById(R.id.predictscardimage); 
     progress = (ContentLoadingProgressBar) 
     view.findViewById(R.id.predictsprogress); 
    } 

} 
public predictsCardAdapter(List<addNewCard> cardMakerList){ 
    this.cardMakerList = cardMakerList; 
} 
@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.predicted_card, parent, false); 
    return new MyViewHolder(itemView); 
} 
@Override 
public void onBindViewHolder 
(final MyViewHolder predicts_holder, int position) { 
    addNewCard cardmaker = cardMakerList.get(position); 
    predicts_holder.cardText.setText(cardmaker.getCardName()); 
    predicts_holder.speechText.setText(cardmaker.getCardName()); 
    //Drawable d = new 
    BitmapDrawable(Utility.getPhoto(cardmaker.getCardIcon())); 

    String url = cardmaker.getCardIcon(); 
    ImageLoader imageLoader = ImageLoader.getInstance(); 
    DisplayImageOptions options = new 
    DisplayImageOptions.Builder().cacheInMemory(true) 
      .cacheOnDisc(true).resetViewBeforeLoading(true) 
      .showImageForEmptyUri(R.drawable.loading_image) 
      .showImageOnFail(R.drawable.broken_image).build(); 

    imageLoader.displayImage 
    (url, predicts_holder.cardImage, options, new 
    SimpleImageLoadingListener() { 
     @Override 
     public void onLoadingStarted(String imageUri, View view) { 
      predicts_holder.progress.setVisibility(View.VISIBLE); 
     } 

     @Override 
     public void onLoadingFailed 
     (String imageUri, View view, FailReason failReason) { 
      predicts_holder.progress.setVisibility(View.GONE); 
     } 

     @Override 
     public void onLoadingComplete 
    (String imageUri, View view, Bitmap loadedImage) { 
      predicts_holder.progress.setVisibility(View.GONE); 
     } 
    }); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
predicts_holder.cardText.setTextAppearance 
(android.R.style.TextAppearance_Material_Small); 
    } 
    else{ 
     predicts_holder.cardText.setTextAppearance 
(predicts_holder.cardImage.getContext( ), 
android.R.style.TextAppearance_Material_Small); 
    } 
    predicts_holder.cardText.setTextSize(10); 
} 
@Override 
public int getItemCount(){ 
    return cardMakerList.size(); 
} 
} 

public interface ItemTouchHelperAdapter { 
boolean onItemMove(int fromPosition, int toPosition); 
void onItemDismiss(int position); 
} 

と私は

mAdapter.onItemMove(viewHolder.getAdapterPosition(), 
target.getAdapterPosition()); 

にドラッグのコメントを解除し、半分をドロップする場合、私は取得エラーがonMove方法で

java.lang.IndexOutOfBoundsException 

at java.util.Collections.swap(Collections.java:1937) 

at 

ss.sealstudios.com.socialstories.predictsCardAdapter. 
onItemMove(predictsCardAdapter.java:33) 

at ss.sealstudios.com.socialstories.SimpleItemTouchHelperCallback 
.onMove(SimpleItemTouchHelperCallback.java:36) 

あるこの

ItemTouchHelper.Callback callback = new  
SimpleItemTouchHelperCallback(predicts_card_adapter); 
    ItemTouchHelper touchHelper = new ItemTouchHelper(callback); 
    touchHelper.attachToRecyclerView(recyclerView); 

ように私の活動でそれを使用私はそれをドラッグすることができますが、それをドロップしないとビューはそれを収容するために移動しないでください 私はその私のcardMakerのリストを考えさせるが、それは単なる広告からのリストですatabase、誰も私が何かを見ることができますか?

答えて

0

私はあなたのアダプタのonItemMove方法を編集し、これは例外を回避し、右の順序付きリストを取得し、コードの下に見ることができます:

@Override 
public boolean onItemMove(int fromPosition, int toPosition) { 
    if (cardMakerList == null || cardMakerList.size() == 0) { 
     return; 
    } 
    if (fromPosition < 0 || fromPosition >= cardMakerList.size()) { 
     return; 
    } 
    if (toPosition < 0 || toPosition >= cardMakerList.size()) { 
     return; 
    } 
    if (fromPosition == toPosition) { 
     return; 
    } 
    T toMoveE = cardMakerList.get(fromPosition); 
    if (fromPosition > toPosition) { 
     for (int i = fromPosition; i > toPosition; i--) { 
      cardMakerList.set(i, cardMakerList.get(i - 1)); 
     } 
    } else { 
     for (int i = fromPosition; i < toPosition; i++) { 
      cardMakerList.set(i, cardMakerList.get(i + 1)); 
     } 
    } 
    cardMakerList.set(toPosition, toMoveE); 
    notifyItemMoved(fromPosition, toPosition); 
    return true; 
} 
関連する問題