RecyclerView błąd w wyświetlaniu obrazów

0

W bazie mam kolumny: id, url, tytuł, data oraz kolumnę "rek" która określa co ma być wyświetlane.
Jesli rek = 0 to ustawiam wysokośc obrazu na 160 dp a pod spodem dodaję tytuł obrazu i datę
Jesli rek =1 to obraz ma wypełnić cały cardView a tytuł i data nie są wyświetlane.
Dane pobieram za pomocą JSON i wyświetlam je za pomocą RecyclerView w CardView.
Z tego co się orientuję to RecyclerView działa w taki sposób, że podmienia treść w wygenerowanych kartach (z moich obserwacji wynika, że generuje ich 5)
Problem pojawia się gdy rek = 1 a obrazy mają różną wysokość. Po przewijaniu RecyclerView zapamiętuje wysokości kart i nie są wypełnione obrazem (tworzy się górny i dolny margines). Dla wszystkich rek = 0 wyświetla poprawnie czyli obraz ma 160 dp a pod spodem jest tytuł i data.
kod adaptera:

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.MyViewHolder> {

    private Context mContext;
    private List<TabelaNews> mDataNews;

    public NewsAdapter(Context mContext, List<TabelaNews> mDataNews) {
        this.mContext = mContext;
        this.mDataNews = mDataNews;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {

        View view;
        LayoutInflater inflater = LayoutInflater.from(mContext);
        view = inflater.inflate(R.layout.karta_news, parent, false);

        final MyViewHolder viewHolder = new MyViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        String mRek = mDataNews.get(holder.getAdapterPosition()).getRek();
        if (mRek.equals("1")) {

            holder.tvTytul.setVisibility(View.GONE);
            holder.tvData.setVisibility(View.GONE);

            holder.ivImage.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
            RequestOptions option = new RequestOptions().dontTransform().placeholder(R.drawable.obraz_def).error(R.drawable.obraz_def);
            Glide.with(mContext).load(mDataNews.get(position).getImageUrl()).apply(option).into(holder.ivImage);
        } else {

            holder.tvTytul.setVisibility(View.VISIBLE);
            holder.tvData.setVisibility(View.VISIBLE);

            holder.tvTytul.setText(mDataNews.get(position).getTytul());
            
            String mData = mDataNews.get(holder.getAdapterPosition()).getData();
            String mRok = mData.substring(0, 4);
            String mMiesiac = mData.substring(5, 7);
            String mDzien = mData.substring(8, 10);
            holder.tvData.setText(mDzien + "." + mMiesiac + "." + mRok + " r.");

            holder.ivImage.getLayoutParams().height = (int) holder.ivImage.getResources().getDimension(R.dimen.imageview_height);
            RequestOptions option = new RequestOptions().centerCrop().placeholder(R.drawable.obraz_default).error(R.drawable.obraz_default);
            Glide.with(mContext).load(mDataNews.get(position).getImageUrl()).apply(option).into(holder.ivImage);
        }
    }

    @Override
    public int getItemCount() {

        return mDataNews.size();
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {

        TextView tvTytul;
        TextView tvData;
        ImageView ivImage;

        public MyViewHolder(View itemView) {
            super(itemView);

            tvTytul = itemView.findViewById(R.id.news_tytul);
            tvData = itemView.findViewById(R.id.news_data);
            ivImage = itemView.findViewById(R.id.news_img);
        }
    }
}

Jakiś pomysł aby rozwiązać ten problem?

0

musisz miec 2 rozne klasy rozszerzajace ViewHolder (czyli 2 rozne ViewHoldery w zaleznosci od typu danych ktore chcesz pokazac)

tutaj masz przyklad:
https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView

0

Nie bardzo o to chodzi.
Chodzi mi o to, że przy zmiennej wysokości obrazu umieszczonego w CardView karty się rozjeżdżają.

0

no to jezeli masz 1000 obrazkow i kazdy z nich ma inna wysokosc to w onBind musisz pobrac wysokosc obrazka i ustawic wysokosc viewHoldera, tylko jest to malo wydajne.

przuklad:
https://stackoverflow.com/questions/31405919/android-how-to-change-recyclerview-height-dynamically/31410475?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

0

Najlepsze zachowanie da Ci pewnie ConstraintLayout z czymś takim jak np. app:layout_constraintDimensionRatio="H,16:9" i odpowiednim dla Ciebie skalowaniem. Jak nie chcesz używać ConstrainLayout możesz zawsze ustawić android:adjustViewBounds="true" i dobrać odpowiednie skalowanie. Wtedy będziesz z kolei walczył pewnie z innymi problemami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1