1

I am working on an application where I have to display images stored in phone directory.I have implemented the code to get all images in recyclerview, but I want to show the date of the image when it was taken inside header. I have searched for many days but couldn't find any specific answer. The design I am following is in this Image

Here I am initializing my view

 @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view= inflater.inflate(R.layout.fragment_list_images,container,false);
    ButterKnife.bind(this,view);
    context= view.getContext();
    adapter= new ImagesAdapter();
    LinearLayoutManager linearVertical = new LinearLayoutManager(view.getContext(), LinearLayoutManager.VERTICAL,false);
    recyclerView.setLayoutManager(linearVertical);
    recyclerView.setAdapter(adapter);
    checkboxHeaderVideo.setClickable(false);
    adapter.setData(getImages(context));
    return view;
}

And here I am getting all pictures from directory

 private List<ImagesModel> getImages(Context context) {

    ArrayList<ImagesModel> ImagesModels= new ArrayList<>();

    int int_position = 0;
    Uri uri;

    int column_index_data, thum, column_index_gif, thumGif;

    String absolutePathOfImage = null;
    String duration = null;
    uri = MediaStore.Image.Media.EXTERNAL_CONTENT_URI;

    String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.Image.Media.BUCKET_DISPLAY_NAME,MediaStore.Image.Media._ID,MediaStore.Image.Thumbnails.DATA};

    final String orderBy = MediaStore.Image.Media.DATE_TAKEN;
    cursor = context.getContentResolver().query(uri, projection, null, null, orderBy + " DESC");
    column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
    thum = cursor.getColumnIndexOrThrow(MediaStore.Image.Thumbnails.DATA);
    while (cursor.moveToNext()) {
        absolutePathOfImage = cursor.getString(column_index_data);
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        File files= new File(absolutePathOfImage);
        if (files.exists()){
            retriever.setDataSource(absolutePathOfImage);
            ArrayList<String> list = AppUtils.fileParsing(absolutePathOfImage);
            String path_name =list.get(0);
            Log.i("path name",path_name);


            ImagesModel obj_model = new ImagesModel();
            obj_model.setImageName(path_name);
            obj_model.setThumbNail(cursor.getString(thum));
            obj_model.setSelected(false);
            obj_model.setAbsolutePath(absolutePathOfImage);
            ImagesModels.add(obj_model);
        }
    }
    listSize= ImagesModels.size();
    return ImagesModels;

}

Image Adapter.

public class ImagesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

List<ImagesModel> modelList;
private boolean selection;
OnSelectionChangeListener selectionChangeListener;
int count=0;
public void setSelectionChangeListener(OnSelectionChangeListener selectionChangeListener) {
    this.selectionChangeListener = selectionChangeListener;
}


@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.li_Images_list,parent,false);
    return new ImagesItemHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    int size= modelList.size();
    ((ImagesItemHolder)holder).bindData(modelList.get(position),position,size);

}

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

public void setData(List<ImagesModel> list) {
    this.modelList= list;
    notifyDataSetChanged();
}
public boolean isSelection() {
    return selection;
}

public void setSelection(boolean selection) {
    this.selection = selection;
    if (selectionChangeListener != null)
        selectionChangeListener.onSelectionChange(selection);
    notifyDataSetChanged();
}

public void clearSelection() {
    for (ImagesModel obj : getData()) {
        obj.setSelected(false);
    }
    setSelection(false);
    count=0;
}

public interface OnSelectionChangeListener {
    void onSelectionChange(boolean selection);
}
public List<ImagesModel> getData() {
    return modelList;
}

public void setChecked(int position) {
    count++;
    getData().get(position).setSelected(!getData().get(position).isSelected());

    if (!isAnyItemSelected()) {
        setSelection(false);
    } else notifyItemChanged(position);
}


boolean isAnyItemSelected() {
    for (ImagesModel obj : getData()) {
        if (obj.isSelected())
            return true;
    }
    return false;
}


public void setCheckedAll(boolean selection) {

    for (ImagesModel object : getData())
        object.setSelected(selection);
    count= getData().size();
    setSelection(selection);
}
public int getSelectedItemCount(){
    return count;
}

public ArrayList<ImagesModel> getAllSelectedItems() {
    ArrayList<ImagesModel> selectedObjects = new ArrayList<>();
    if (getData() != null && !getData().isEmpty()) {
        for (ImagesModel item : getData()) {
            if (item.isSelected()) selectedObjects.add(item);
        }
    }
    return selectedObjects;
}

Problem is i don't know how to add Date as header in specific format and show related images below that specific date

  • Please publish, what did you try to this time and what problems your have – Kamil Naja Aug 10 '18 at 07:05
  • The way to go is "getItemViewType()": https://stackoverflow.com/questions/26530685/is-there-an-addheaderview-equivalent-for-recyclerview (normal header) --- https://stackoverflow.com/questions/32949971/how-can-i-make-sticky-headers-in-recyclerview-without-external-lib (sticky header) – hamena314 Aug 10 '18 at 10:49
  • Did you find the solution for this? I am facing the same issue. Please let me know. – Sid Jan 30 '20 at 12:54

0 Answers0