Группировка изображений по дате в recyclerView android - PullRequest
0 голосов
/ 05 августа 2020

Я новичок в android Я пытаюсь сгруппировать изображения в recyclerview по дате Я передаю отсортированную дату в ArrayList, а HashMap содержит дату как ключ и путь к изображению как значение, все работает нормально, но проблема в отображении текстового представления не отображается, а изображения не отображаются в сетке

Результат, который я хочу:

Результат, который я получаю:

Адаптер My RecyclerView

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);
        }
    }
}

Фрагмент

    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;
}

1 Ответ

0 голосов
/ 09 августа 2020

Решение найдено Мы можем использовать вложенный RecyclerView Родительский адаптер

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);
        }
    }
}

Дочерний адаптер

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);
        }
    }
}

Фрагмент

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;
    }
}

Надеюсь, это будет полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...