У меня есть Recycler View внутри Coordinator Layout с GridLayoutManager, установленным в вертикальное положение, и пользовательским адаптером.
Количество столбцов может изменяться самостоятельно при изменении макета с помощью onLayoutChangeListener .
Данные Адаптера представления Recycler загружаются асинхронно и каждый раз, когда они изменяются, я вызываю recyclerview.getAdapter () .notifyDataSetChanged () , чтобы убедиться, что представление Recycler отображает их.
Я запускаю приложение на Android Lollipop или более, и build.gradle имеет такую реализацию библиотеки поддержки:
implementation 'com.android.support:recyclerview-v7:27.0.2'
По какой-то причине кажется, что данные загружены правильно и чтоВысота и ширина макета верны в соответствии с загруженными данными, но карты внутри сетки не видны , вот скриншот границ представления рециркулятора, чтобы доказать мою точку зрения:
Высота представления рециркулятора изменяется при изменении вставленных данных, но элементы не отображаются
Вот код операции, содержащей представление рециркулятора:
public class SessionChildrenActivity extends AppCompatActivity {
private RecyclerView recyclerView;
public static ArrayList<SessionChild> ChildrenList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_session_children);
ChildrenList = new ArrayList<>();
recyclerView = findViewById(R.id.children_gridview);
recyclerView.setAdapter(new ChildrenAdapter());
final Context c = this;
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
GridLayoutManager layoutManager = new GridLayoutManager(c,(int)(displayMetrics.widthPixels / (getResources().getDimension(R.dimen.cell_width))),GridLayoutManager.VERTICAL,true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
recyclerView.setLayoutManager(new GridLayoutManager(c,(int)(displayMetrics.widthPixels / (getResources().getDimension(R.dimen.cell_width))),GridLayoutManager.VERTICAL,true));
}
});
//Start of a query (Google Firestore) that gets the children associated with the session, just showing you the part that adds the retrieved child to the list given to the adapter
...
if(ChildrenList.indexOf(child) == -1){
ChildrenList.add(child);
Collections.sort(ChildrenList,new Comparator<SessionChild>() {
@Override
public int compare(SessionChild sc1, SessionChild sc2)
{
return sc1.getChild().getNickname().compareTo(sc2.getChild().getNickname());
}
});
recyclerView.getAdapter().notifyDataSetChanged();
}
...
}
}
Вот код для пользовательского адаптера:
public class ChildrenAdapter extends RecyclerView.Adapter<ChildrenAdapter.ViewHolder> {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.session_child, parent, false);
return new ViewHolder(v);
}
public ChildrenAdapter() {
super();
}
@Override
public void onBindViewHolder(ViewHolder mViewHolder, int position) {
mViewHolder.firstname.setText(SessionChildrenActivity.ChildrenList.get(position).getChild().getNickname());
Calendar birthdate = Calendar.getInstance();
if(SessionChildrenActivity.ChildrenList.get(position).getChild().getPersonalInfo().getBirthdate() != null){
birthdate.setTime(SessionChildrenActivity.ChildrenList.get(position).getChild().getPersonalInfo().getBirthdate());
mViewHolder.age.setText(getAge(birthdate));
}
else
mViewHolder.age.setText("?");
if(SessionChildrenActivity.ChildrenList.get(position).getChild().getPhotoURL() != null && !SessionChildrenActivity.ChildrenList.get(position).getChild().getPhotoURL().equals("") && mViewHolder.image.getDrawingCache() == null) {
new DownloadImageTask(mViewHolder.image).execute(SessionChildrenActivity.ChildrenList.get(position).getChild().getPhotoURL());
}
}
@Override
public int getItemCount() {
return SessionChildrenActivity.ChildrenList.size();
}
@Override
public long getItemId(int position) {
return (long) position;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView firstname;
private ImageView image;
private TextView age;
private ConstraintLayout card;
public ViewHolder(View v) {
super(v);
firstname = v.findViewById(R.id.firstname);
age = v.findViewById(R.id.age);
image = v.findViewById(R.id.thumb_img);
card = v.findViewById(R.id.cardview);
card.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(v.getContext(),child_details.class);
SessionChild sessionChild = SessionChildrenActivity.ChildrenList.get(((ViewGroup)v.getParent()).indexOfChild(v));
intent.putExtra("session_child",sessionChild);
v.getContext().startActivity(intent);
}
});
}
}
private String getAge(Calendar dob){
Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)){
age--;
}
return String.valueOf(age);
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
}
Вот XML-файл раздутых ViewHolders и скриншот wВ Android Studio это выглядит так:
Макет элемента, накачанный адаптером
<android.support.constraint.ConstraintLayout 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:id="@+id/cardview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/card"
android:foreground="?attr/selectableItemBackground">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="4dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/age"
style="@android:style/TextAppearance.Material.Medium"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:paddingStart="4dp"
android:text="@string/whatever"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="@+id/thumb_img"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
android:id="@+id/firstname"
style="@android:style/TextAppearance.Material.Medium"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:paddingEnd="4dp"
android:paddingStart="8dp"
android:text="@string/note"
android:textColor="@android:color/white"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@+id/thumb_img"
app:layout_constraintEnd_toStartOf="@+id/age"
app:layout_constraintStart_toStartOf="parent" />
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/thumb_img"
android:layout_width="0dp"
android:layout_height="0dp"
android:contentDescription="@string/whatever"
android:scaleType="centerCrop"
app:layout_constraintDimensionRatio="H,1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:riv_corner_radius="8dp"
app:riv_oval="false" />
<ImageView
android:id="@+id/delete_confirm"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginEnd="2dp"
android:layout_marginTop="2dp"
android:contentDescription="@string/whatever"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/guideline10"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/fui_done_check_mark" />
<ImageView
android:layout_width="0dp"
android:layout_height="0dp"
android:contentDescription="@string/whatever"
android:src="@drawable/card_bottom"
app:layout_constraintBottom_toBottomOf="@+id/thumb_img"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/firstname">
</ImageView>
<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.8" />
<android.support.constraint.Guideline
android:id="@+id/guideline10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.2" />
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
И, наконец, вот код дляПредставление переработчика xml:
<RelativeLayout 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.support.v7.widget.RecyclerView
android:id="@+id/children_gridview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
Я не видел ни одной проблемы, сообщающей об этой ошибке, поэтому, если у вас есть представление о том, откуда она может возникнуть, это было бы очень полезно.Извините за длинный пост, я попытался удалить как можно больше ненужного кода.Надеюсь, кто-нибудь сможет мне помочь!