コードを実行するときにonItemTouchHelperとコールバックメソッドを実装する方法についてのチュートリアルをここでフォローしましたが、アイテムを長押しして拾うことができるまで機能しますが、アプリのリスト内の他のアイテムの1つを通過した瞬間に移動します範囲外の例外でインデックスを強制的に閉じますここで誰か助けてもらえますか?
これが私のコードですが、チュートリアルのコードと同じです。
シンプルなアイテム タッチ ヘルパー コールバック
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());
}
}
これが私のアダプターです
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();
}
}
私もItemTouchHelperAdapterを持っています
public interface ItemTouchHelperAdapter {
boolean onItemMove(int fromPosition, int toPosition);
void onItemDismiss(int position);
}
そして、私はこのような私の活動でそれを使用します
ItemTouchHelper.Callback callback = new
SimpleItemTouchHelperCallback(predicts_card_adapter);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(recyclerView);
私が得るエラーは
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)
onMove メソッドで、コメントを外した場合
mAdapter.onItemMove(viewHolder.getAdapterPosition(),
target.getAdapterPosition());
ドラッグアンドドロップの半分は機能するので、ドラッグすることはできますがドロップすることはできず、ビューはそれに対応するために移動しません。これは私のcardMakerリストだと思いますが、それはデータベースからのリストにすぎません。