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

Odpowiedz Nowy wątek
2018-04-09 22:23
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?

  • 1.png (0,66 MB) - ściągnięć: 41
  • 2.jpg (0,32 MB) - ściągnięć: 61

Pozostało 580 znaków

2018-04-10 20:52
EloMoto
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/a[...]s-Layouts-inside-RecyclerView

Pozostało 580 znaków

2018-04-10 21:49
0

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

Pozostało 580 znaków

2018-04-11 17:07
EloMoto
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/que[...]p;utm_campaign=google_rich_qa

Pozostało 580 znaków

2018-04-11 18:17
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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