Android-ItemTouchHelper-Demo icon indicating copy to clipboard operation
Android-ItemTouchHelper-Demo copied to clipboard

Cannot Update the position of the dragged file

Open aloklearning opened this issue 8 years ago • 1 comments

Since my drag and drop is working fine but still the item which has been moved is not updating its position. The code is like this :

public class EditVideoActivity extends AppCompatActivity implements OnStartDragListener{

private ImageButton filterButton,cutButton;
//audioButton;

ArrayList<File> mList;
ArrayList<File> files;
private static int position = 0;

RecyclerView recyclerView;
private String selectedVideo;

private int selectedPos;

ViewAdapter viewAdapter;

RecyclerView.LayoutManager layoutManager;

private VideoView mVideoView;

private MediaController mController;

private Project project;

private ItemTouchHelper itemTouchHelper;

//private static final int CustomizeAudio = 1;
private static final int CustomizeFilter = 2;
private static final int CustomCutvideo = 3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.activity_edit_video);

    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(R.layout.edit_header_layout);
    getSupportActionBar().setHomeAsUpIndicator(R.mipmap.ic_keyboard_arrow_left_black_24dp);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    mVideoView = (VideoView) findViewById(R.id.editVideoPlayer);

    filterButton = (ImageButton) findViewById(R.id.filterVideo);
    cutButton = (ImageButton) findViewById(R.id.cutVideo);
    //audioButton = (ImageButton) findViewById(R.id.musicalNotes);

    //change the color of the imagebutton explicitely
    filterButton.setColorFilter(Color.BLACK);
    cutButton.setColorFilter(Color.BLACK);
    //audioButton.setColorFilter(Color.BLACK);

    recyclerView = (RecyclerView) findViewById(R.id.videoGallery);
    recyclerView.setHasFixedSize(true);

    mList = new ArrayList<>();

    int view = getIntent().getIntExtra("view", 0);

    //this is for admin activity else addfragment
    if(view == 1){
        project = (Project) getIntent().getSerializableExtra("groupVideoData");
        Log.e("PROJECT_ID", String.valueOf(project.getId()));
        Log.e("PROJECT_DATA", String.valueOf(project.getVideoData().size()));

        for(String adminPath : project.getVideoData()){
            File files = new File(adminPath);
            mList.add(files);
        }


        //inflating the layout horizontally
        layoutManager = new LinearLayoutManager(getParent(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        viewAdapter = new ViewAdapter(mList);
        Log.e("LIST====", mList.toString());
        recyclerView.setAdapter(viewAdapter);
        recyclerView.setVisibility(View.VISIBLE);

        ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallBack(viewAdapter);
        itemTouchHelper = new ItemTouchHelper(callback);
        itemTouchHelper.attachToRecyclerView(recyclerView);

    }else {
        //getting the value from project class object
        project = (Project) getIntent().getSerializableExtra("passedData");
        Log.e("project id====", String.valueOf(project.getId()));
        Log.e("project data =====", String.valueOf(project.getVideoData().size()));
        //Log.e("RECEIVED DATA=====", receivedData.toString());

        for (String path : project.getVideoData()) {
            //initialising path with file
            File file = new File(path);
            Log.e("FILENAME===", path);
            mList.add(file); //adding file in array list<file> object
        }

        //inflating the layout horizontally
        layoutManager = new LinearLayoutManager(getParent(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        viewAdapter = new ViewAdapter(mList);
        Log.e("LIST====", mList.toString());
        recyclerView.setAdapter(viewAdapter);
        recyclerView.setVisibility(View.VISIBLE);

        ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallBack(viewAdapter);
        itemTouchHelper = new ItemTouchHelper(callback);
        itemTouchHelper.attachToRecyclerView(recyclerView);
    }

}
//just for a change
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.edit_video, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;

        case R.id.moveNext:
            Intent intent = new Intent(EditVideoActivity.this,PreviewActivity.class);
            //sending the file in string array list form to avoid mismatch of the file to string
            //conversion
            ArrayList<String> files = new ArrayList<>();
            for(File file : mList){
                files.add(file.getAbsolutePath());
            }
            intent.putStringArrayListExtra("videosList",files);
            intent.putExtra("videos", project);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onBackPressed() {
    moveTaskToBack(false);
}

@Override
public void onDragStart(RecyclerView.ViewHolder viewHolder) {
    itemTouchHelper.startDrag(viewHolder);
}`

and my RecyclerViewAdapter is here . :

public class ViewAdapter extends RecyclerView.Adapter<ViewAdapter.ViewHolder> implements 
  ItemTouchHelperAdapter{
```


        private View rootView;

        private Bitmap bitmap;

        //calling the mList in constructor's argument item
        public ViewAdapter(ArrayList<File> items) {
            files = items;
            Log.e("ITEMS====",items.toString());
        }


        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                Log.e("ADAPTER","VIEW HOLDER CREATED");
            Context context = parent.getContext();
            LayoutInflater inflater = LayoutInflater.from(context);

            rootView = inflater.inflate(R.layout.custom_listview,parent,false);
            ViewHolder viewholder =  new ViewHolder(rootView);
            return viewholder;
        }

        @Override
        public void onBindViewHolder( ViewHolder holder, final int position) {
            Log.e("ADAPTER",files.get(position).toString());
            EditVideoActivity.position = position;
            if (files != null) {

                bitmap = ThumbnailUtils.createVideoThumbnail(files.get(position).toString(),1);
                holder.mImageView.setImageBitmap(bitmap);
                //click event from the holder
                holder.mImageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //getting the details of the selected video
                        updatedVideo();
                        Log.e("POS_SELECTED", String.valueOf(files.indexOf(files.get(position))));
                    }
                });

            }

        }

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


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

        @Override
        public void onItemDismiss(int position) {

        }


        //holder holding the image object from the custom listView
          class ViewHolder extends RecyclerView.ViewHolder {
            public ImageView mImageView;
            public String videoPosition;
            public int videoPos;

              public ViewHolder(View view) {
                  super(view);

                  mImageView = (ImageView) view.findViewById(R.id.imageView);

                 //  -----------  FILTER EDITING   -----------------
                  filterButton.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View view) {
                          videoPosition = selectedVideo;
                          videoPos = selectedPos;

                          if(videoPosition != null){
                              Intent intent = new Intent(EditVideoActivity.this, FilterActivity.class);
                              intent.putExtra("videoData",videoPosition);
                              intent.putExtra("position",selectedPos); //sending the data of the position
                              Log.e("VIDEO_SENT_DATA=======", videoPosition);
                              Log.e("POSITION===",String.valueOf(selectedPos));
                              startActivityForResult(intent,CustomizeFilter);
                          }else
                              Toast.makeText(EditVideoActivity.this,"You have not selected any video",Toast.LENGTH_LONG)
                                      .show();
                      }
                  });

                  // --------------- CUT VIDEO  ----------------
                  cutButton.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View view) {
                          videoPosition = selectedVideo;
                          videoPos = selectedPos;

                          if(videoPosition != null){
                              Intent intent = new Intent(EditVideoActivity.this,CutVideoActivity.class);
                              intent.putExtra("videoData",videoPosition);
                              intent.putExtra("position",selectedPos); //sending the data of the position
                              Log.e("VIDEO_SENT_DATA=======", videoPosition);
                              Log.e("POSITION===",String.valueOf(selectedPos));
                              startActivityForResult(intent,CustomCutvideo);
                          }else
                              Toast.makeText(EditVideoActivity.this,"You have not selected any video",Toast.LENGTH_LONG)
                                      .show();
                      }
                  });
              }

        }
    }

    private void updatedVideo() {

        //getting video position for passing the data
        selectedVideo = files.get(position).toString();

        //getting the position of the selected one
        selectedPos = files.indexOf(files.get(position));

        //for starting the video activity
        mVideoView.setVideoPath(files.get(position).toString());
        mController = new MediaController(EditVideoActivity.this);
        mController.setMediaPlayer(mVideoView);
        mVideoView.setMediaController(mController);
        mVideoView.requestFocus();
        mVideoView.start();
    }`

In my logcat if I select the first one that is at pos = 0 then after dragging to pos = 1 and selecting the same again it will give the selected pos = 0 only.

aloklearning avatar Nov 02 '17 08:11 aloklearning

try changing onItemMove like this,

@Override
public boolean onItemMove (int fromPosition, int toPosition) {
    File item = files.get(fromPosition);
    files.remove(fromPosition);
    files.add(toPosition, item);

    notifyItemMoved(fromPosition, toPosition);
    return true;
}

sahilgargkis avatar Jul 05 '18 07:07 sahilgargkis