简体   繁体   中英

Grouping images by date in recyclerView android

I'm new to android I'm trying to group images in recyclerview by date I'm passing sorted date in ArrayList and HashMap contains date as key and image path as value everything working fine but the problem is displaying textview is not visible and images not displaying in grid

The output I want:

The output I'm getting:


My RecyclerView adapter

public class ImageRecycler extends RecyclerView.Adapter<RecyclerView.ViewHolder>  {
    private static final String TAG = "RecyclerException";
    ArrayList<Date> list;
    Activity activity;
    String date="";
    HashMap<String,String> data;
    private static final int DATEVIEW = 1;
    public ImageRecycler(ArrayList<Date> list, Activity activity,HashMap<String,String> data){
        this.list=list;
        this.activity=activity;
        date=list.get(0).toString();
        date=date.substring(0,11);
        this.data=data;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view;
            if(viewType==DATEVIEW) {
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_image, parent, false);
                return new MyViewHolder(view);
            }
            else {
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_text, parent, false);
                return new MyTextHolder(view);
            }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        final String ImageDate = list.get(position).toString();
        final String ImageDateSub=ImageDate.substring(0,11);
        String ImagePath=data.get(ImageDate);
        if(holder.getItemViewType()!=DATEVIEW) {
            ((MyTextHolder)holder).textView.setText(ImageDateSub);
          
        }
        else{
            Glide.with(activity)
                 .asBitmap()
                 .load(ImagePath)
                 .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                 .into(((MyViewHolder)holder).imageView);
           
        }
    }

    @Override
    public int getItemViewType(int position) {
        super.getItemViewType(position);
        String temp=list.get(position).toString().substring(0,11);
        if(date.compareTo(temp)!=0){
            date=temp;
            return 0;
        }
        else
            return DATEVIEW;

    }
    @Override
    public int getItemCount() {
       return list.size();
    }
    public  class MyTextHolder extends  RecyclerView.ViewHolder{
        TextView textView;
        public MyTextHolder(@NonNull  View itemView){
            super(itemView);
            textView=itemView.findViewById(R.id.date);
        }
    }
    public class MyViewHolder extends RecyclerView.ViewHolder{
        ImageView imageView;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView=itemView.findViewById(R.id.listImage);
        }
    }
}

Fragment

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_images,container,false);
        recyclerView=view.findViewById(R.id.ImageList);
        layoutManager=new GridLayoutManager(getContext(),4);
        layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                int i = imageRecycler.getItemViewType(position) == imageRecycler.DATEVIEW ? 4 : 1;
                return i;
            }
        });
        recyclerView.setLayoutManager(layoutManager);
        return view;
}

Solution Found We can use nested RecyclerView Parent Adapter

public class ParentAdapter extends RecyclerView.Adapter<ParentAdapter.MyViewHolder>  {
    private static final String TAG = "RecyclerException";
    HashMap<String,ArrayList<String>> Data;
    Activity activity;
    private RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();
    ArrayList<String> keyData;
    public ParentAdapter(HashMap<String, ArrayList<String>> Data,Activity activity){
        this.activity=activity;
        this.Data=Data;
        keyData=new ArrayList<>(Data.keySet());
    }
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.single_text,parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.textView.setText(keyData.get(position));
        GridLayoutManager GM=new GridLayoutManager(holder.recyclerView.getContext(),4);
        GM.setInitialPrefetchItemCount(Data.get(keyData.get(position)).size());
        childRecycler childRecycler=new childRecycler(Data.get(keyData.get(position)),activity);
        holder.recyclerView.setLayoutManager(GM);
        holder.recyclerView.setAdapter(childRecycler);
        holder.recyclerView.setRecycledViewPool(viewPool);
    }

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

    public class MyViewHolder  extends RecyclerView.ViewHolder{
        TextView textView;
        RecyclerView recyclerView;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            textView=itemView.findViewById(R.id.date);
            recyclerView=itemView.findViewById(R.id.child_recyclerview);
        }
    }
}

Child Adapter

public class childRecycler extends RecyclerView.Adapter<childRecycler.ChildViewHOlder> {
    ArrayList<String> ChildData;
    Activity activity;
    public childRecycler(ArrayList<String> ChildData, Activity activity){
        this.ChildData=ChildData;
        this.activity=activity;
    }

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

    @Override
    public void onBindViewHolder(@NonNull childRecycler.ChildViewHOlder holder, int position) {
        Glide.with(activity)
                .asBitmap()
                .centerCrop()
                .fitCenter()
                .load(ChildData.get(position))
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                .into(holder.imageView);
    }

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

    public class ChildViewHOlder extends RecyclerView.ViewHolder{
        ImageView imageView;
        public ChildViewHOlder(@NonNull View itemView) {
            super(itemView);
            imageView=itemView.findViewById(R.id.listImage);
        }
    }
}

Fragment

public class ImagesFragment extends Fragment {

    private View view;
    private RecyclerView recyclerView;
    LinearLayoutManager layoutManager;
    ParentAdapter parentAdapter;
    HashMap<String,String> imageData = new HashMap<>();

    private Cursor cursor;
    private  int columnIndex;
    public ImagesFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_images,container,false);
        recyclerView=view.findViewById(R.id.ImageList);
        layoutManager= new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(parentAdapter);
        return view;
    }
}

I hope this will be usefull

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM