Исчезают элементы в cardview

225
01 мая 2018, 02:25

Элементы cardview выводятся в RecyclerView. При запуске приложения сначала все нормально. Стоит пролистать список вниз и обратно, как пропадают некоторые элементы разметки (изображения) и появляются те, которых по логике не должно быть. В чем дело?

На первом скриншоте то как должно выглядеть и как выглядет при запуске, на втором то же самое при прокрутке вниз-вверх

Адаптер

public class AdAdapter_1 extends RecyclerView.Adapter<AdAdapter_1.AdViewHolder> {
    // Объявление переменных
    private DatabaseReference myRef;
    private Context mCtx;
    private List<Ad> adList;
    private int type;
    private String title, desc, phone, image;
    public AdAdapter_1(Context mCtx, List<Ad> adList) {
        this.mCtx = mCtx;
        this.adList = adList;
    }
    @Override
    public AdViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // Инициализация Firebase
        myRef = FirebaseDatabase.getInstance().getReference();
        return new AdViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.ad, parent, false));
    }
    @Override
    public void onBindViewHolder(final AdViewHolder holder, final int position) {
        final Ad ad = adList.get(position);

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // Настройки отображения и цветов
                if (ad.title == null)
                    holder.tvTitle.setVisibility(View.GONE);
                if (ad.image == null)
                    holder.ivCover.setVisibility(View.GONE);
                if (ad.desc == null)
                    holder.tvDesc.setVisibility(View.GONE);
                if (ad.desc == null && ad.image == null)
                    holder.cvAd.setCardBackgroundColor(Color.WHITE);
                else
                    holder.cvAd.setCardBackgroundColor(mCtx.getResources().getColor(R.color.pink_100));
                holder.tvFenix.setTextColor(mCtx.getResources().getColor(R.color.pink_400));
                holder.tvVodafon.setTextColor(mCtx.getResources().getColor(R.color.pink_400));
                holder.tvGorod.setTextColor(mCtx.getResources().getColor(R.color.pink_400));
                holder.tvFenixViber.setTextColor(mCtx.getResources().getColor(R.color.pink_400));
                holder.tvVodafonViber.setTextColor(mCtx.getResources().getColor(R.color.pink_400));
                holder.tvEmail.setTextColor(mCtx.getResources().getColor(R.color.pink_400));
                holder.tvSkype.setTextColor(mCtx.getResources().getColor(R.color.pink_400));
                holder.tvWeb.setTextColor(mCtx.getResources().getColor(R.color.pink_400));

                final String fenix = dataSnapshot.child("info").child(ad.key + "").child("fenix").getValue(String.class);
                final String vodafon = dataSnapshot.child("info").child(ad.key + "").child("vodafon").getValue(String.class);
                final String gorod = dataSnapshot.child("info").child(ad.key + "").child("gorod").getValue(String.class);
                final String fenix_viber = dataSnapshot.child("info").child(ad.key + "").child("fenix_viber").getValue(String.class);
                final String vodafon_viber = dataSnapshot.child("info").child(ad.key + "").child("vodafon_viber").getValue(String.class);
                final String email = dataSnapshot.child("info").child(ad.key + "").child("email").getValue(String.class);
                final String skype = dataSnapshot.child("info").child(ad.key + "").child("skype").getValue(String.class);
                final String web = dataSnapshot.child("info").child(ad.key + "").child("web").getValue(String.class);
                // Настройки отображения дополнительной информации
                if (fenix != null)
                    holder.infoFenix.setVisibility(View.VISIBLE);
                if (vodafon != null)
                    holder.infoVodafon.setVisibility(View.VISIBLE);
                if (gorod != null)
                    holder.infoGorod.setVisibility(View.VISIBLE);
                if (fenix_viber != null)
                    holder.infoFenixViber.setVisibility(View.VISIBLE);
                if (vodafon_viber != null)
                    holder.infoVodafonViber.setVisibility(View.VISIBLE);
                if (email != null)
                    holder.infoEmail.setVisibility(View.VISIBLE);
                if (skype != null)
                    holder.infoSkype.setVisibility(View.VISIBLE);
                if (web != null)
                    holder.infoWeb.setVisibility(View.VISIBLE);
                // Показ
                Picasso.with(mCtx).load(ad.image).error(R.drawable.error).placeholder(R.drawable.load).into(holder.ivCover);
                holder.tvTitle.setText(ad.title);
                holder.tvDesc.setText(ad.desc);
                holder.tvFenix.setText(fenix);
                holder.tvVodafon.setText(vodafon);
                holder.tvGorod.setText(gorod);
                holder.tvFenixViber.setText(fenix_viber);
                holder.tvVodafonViber.setText(vodafon_viber);
                holder.tvEmail.setText(email);
                holder.tvSkype.setText(skype);
                holder.tvWeb.setText(web);
                // настраиваем imageview таким образом, чтобы его высота была равна ширине экрана телефона
                DisplayMetrics displaymetrics = mCtx.getResources().getDisplayMetrics();
                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) holder.ivCover.getLayoutParams(); // получаем параметры
                params.height = displaymetrics.widthPixels / 2; // высота равна половине ширины
                holder.ivCover.setLayoutParams(params);
                // Обрабатываем нажатия
                holder.tvFenix.setOnClickListener (new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { openDial(fenix); }
                });
                holder.tvVodafon.setOnClickListener (new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { openDial(vodafon); }
                });
                holder.tvGorod.setOnClickListener (new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { openDial(gorod); }
                });
                holder.tvFenixViber.setOnClickListener (new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { openDial(fenix_viber); }
                });
                holder.tvVodafonViber.setOnClickListener (new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { openDial(vodafon_viber); }
                });
                holder.tvEmail.setOnClickListener (new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { openEmail(email); }
                });
                holder.tvWeb.setOnClickListener (new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { openWeb(web); }
                });

            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
                //
            }
        });
    }
    @Override
    public int getItemCount() {
        return adList.size();
    }

    // Определение элементов
    class AdViewHolder extends RecyclerView.ViewHolder {
        TextView tvTitle, tvDesc, tvFenix, tvVodafon, tvGorod, tvFenixViber, tvVodafonViber, tvEmail, tvSkype, tvWeb;
        ImageView ivCover;
        CardView cvAd;
        LinearLayout infoFenix, infoVodafon, infoGorod, infoFenixViber, infoVodafonViber, infoEmail, infoSkype, infoWeb;
        public AdViewHolder(View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.tvTitle);
            tvDesc = itemView.findViewById(R.id.tvDesc);
            ivCover = itemView.findViewById(R.id.ivCover);
            cvAd = itemView.findViewById(R.id.cvAd);
            tvFenix = itemView.findViewById(R.id.tvFenix);
            tvVodafon = itemView.findViewById(R.id.tvVodafon);
            tvGorod = itemView.findViewById(R.id.tvGorod);
            tvFenixViber = itemView.findViewById(R.id.tvFenixViber);
            tvVodafonViber = itemView.findViewById(R.id.tvVodafonViber);
            tvEmail = itemView.findViewById(R.id.tvEmail);
            tvSkype = itemView.findViewById(R.id.tvSkype);
            tvWeb = itemView.findViewById(R.id.tvWeb);
            infoFenix = itemView.findViewById(R.id.infoFenix);
            infoVodafon = itemView.findViewById(R.id.infoVodafon);
            infoGorod = itemView.findViewById(R.id.infoGorod);
            infoFenixViber = itemView.findViewById(R.id.infoFenixViber);
            infoVodafonViber = itemView.findViewById(R.id.infoVodafonViber);
            infoEmail = itemView.findViewById(R.id.infoEmail);
            infoSkype = itemView.findViewById(R.id.infoSkype);
            infoWeb = itemView.findViewById(R.id.infoWeb);
        }
    }

// Открываем звонилку
private void openDial(String key) {
    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:" + key));
    mCtx.startActivity(intent);
}
// Открываем почту
private void openEmail(String key) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    String uriText = "mailto:" + Uri.encode(key) +
            "?subject=" + Uri.encode("") +
            "&body=" + Uri.encode("");
    Uri uri = Uri.parse(uriText);
    intent.setData(uri);
    mCtx.startActivity(Intent.createChooser(intent, "Отправить с помощью..."));
}
// Открываем браузер
private void openWeb(String key) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(key));
    mCtx.startActivity(intent);
}

}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="3dp"
    android:orientation="vertical">
    <android.support.v7.widget.CardView
        android:id="@+id/cvAd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardCornerRadius="0dp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/white"
                android:layout_margin="3dp"
                android:padding="10dp"
                android:orientation="vertical">
                <TextView
                    android:id="@+id/tvTitle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="5dp"
                    android:gravity="center"
                    android:textStyle="bold"
                    android:textSize="20sp"
                    tools:text="Пансионат\n«Азовская Креветка»" />
                <ImageView
                    android:id="@+id/ivCover"
                    android:layout_width="match_parent"
                    android:layout_height="130dp"
                    android:layout_marginTop="5dp"
                    android:layout_marginBottom="5dp"
                    android:scaleType="centerCrop"
                    android:adjustViewBounds="true"
                    tools:srcCompat="@drawable/ava" />
                <TextView
                    android:id="@+id/tvDesc"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="14sp"
                    android:layout_marginTop="5dp"
                    android:layout_marginBottom="5dp"
                    android:gravity="center"
                    android:layout_gravity="center"
                    tools:text="комфортабельные номера, горячая вода, душ, санузел, лучший песчаный пляж, рядом магазин с продуктами, детская площадка" />
                <LinearLayout
                    android:id="@+id/infoFenix"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_gravity="center"
                    android:visibility="gone"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="15dp"
                        app:srcCompat="@drawable/fenix" />
                    <TextView
                        android:id="@+id/tvFenix"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textStyle="bold"
                        android:textSize="18sp"
                        tools:text="+7 (812) 318-34-54" />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/infoVodafon"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_gravity="center"
                    android:visibility="gone"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="15dp"
                        app:srcCompat="@drawable/vodafon" />
                    <TextView
                        android:id="@+id/tvVodafon"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textStyle="bold"
                        android:textSize="18sp"
                        tools:text="+7 (812) 318-34-54" />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/infoGorod"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_gravity="center"
                    android:visibility="gone"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="15dp"
                        app:srcCompat="@drawable/phone" />
                    <TextView
                        android:id="@+id/tvGorod"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textStyle="bold"
                        android:textSize="18sp"
                        tools:text="+7 (812) 318-34-54" />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/infoFenixViber"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_gravity="center"
                    android:visibility="gone"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="5dp"
                        app:srcCompat="@drawable/viber" />
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="15dp"
                        app:srcCompat="@drawable/fenix" />
                    <TextView
                        android:id="@+id/tvFenixViber"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textStyle="bold"
                        android:textSize="18sp"
                        tools:text="+7 (812) 318-34-54" />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/infoVodafonViber"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_gravity="center"
                    android:visibility="gone"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="5dp"
                        app:srcCompat="@drawable/viber" />
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="15dp"
                        app:srcCompat="@drawable/vodafon" />
                    <TextView
                        android:id="@+id/tvVodafonViber"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textStyle="bold"
                        android:textSize="18sp"
                        tools:text="+7 (812) 318-34-54" />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/infoEmail"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_gravity="center"
                    android:visibility="gone"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="15dp"
                        app:srcCompat="@drawable/mail" />
                    <TextView
                        android:id="@+id/tvEmail"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textStyle="bold"
                        android:textSize="18sp"
                        tools:text="+7 (812) 318-34-54" />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/infoSkype"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_gravity="center"
                    android:visibility="gone"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="15dp"
                        app:srcCompat="@drawable/skype" />
                    <TextView
                        android:id="@+id/tvSkype"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textStyle="bold"
                        android:textSize="18sp"
                        tools:text="+7 (812) 318-34-54" />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/infoWeb"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:visibility="gone"
                    android:layout_gravity="center"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_marginRight="15dp"
                        app:srcCompat="@drawable/web" />
                    <TextView
                        android:id="@+id/tvWeb"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textStyle="bold"
                        android:textSize="18sp"
                        tools:text="+7 (812) 318-34-54" />
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>
Answer 1

Проблема довольна банальная.

В onBindViewHolder нужно выставлять ВСЕ параметры UI элементов, потому что они recyclable, те используются повторно, нельзя предполагать предыдущее состояние.

Обычно два пути: выставляем всегда все, либо сбрасываем в дефолт и выставляем только то что отлично от него.

READ ALSO
Java обработать строку

Java обработать строку

Думаю, будет проще сразу с примера

202
Арифметические действия в sql запросе

Арифметические действия в sql запросе

Нужно обновить в базе информацию, если с момента изменения прошло больше 3-х сутокПоле last_edit содержит время в формате UNIX

174
Group by не работает со вьюхой

Group by не работает со вьюхой

Выводит запись с id = 1, а должно с id = 2Причем обычным запросом:

195