私はコードを実行すると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、誰も私が何かを見ることができますか?