Элементы 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>
Проблема довольна банальная.
В onBindViewHolder
нужно выставлять ВСЕ параметры UI элементов, потому что они recyclable
, те используются повторно, нельзя предполагать предыдущее состояние.
Обычно два пути: выставляем всегда все, либо сбрасываем в дефолт и выставляем только то что отлично от него.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нужно обновить в базе информацию, если с момента изменения прошло больше 3-х сутокПоле last_edit содержит время в формате UNIX
Выводит запись с id = 1, а должно с id = 2Причем обычным запросом: