Вывод элементов в RecyclerView
пытаюсь написать небольшую игру. Подскажите пожалуйста как реализовать вывод списка уровней в таком виде как на картинке.
Мой адаптер выглядит следующим образом:
public class LevelsAdapter extends RecyclerView.Adapter<LevelsAdapter.LevelViewHolder> {
private List<Level> levels;
private OnLevelClickListener listener;
public interface OnLevelClickListener {
void onLevelClick(int levelNumber);
}
public LevelsAdapter(List<Level> levels, OnLevelClickListener listener) {
this.levels = levels;
this.listener = listener;
}
public void setLevels(List<Level> levels) {
this.levels = levels;
notifyDataSetChanged();
}
public List<Level> getLevels() {
return levels;
}
@NonNull
@Override
public LevelViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_level, parent, false);
return new LevelViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull LevelViewHolder holder, int position) {
Level level = levels.get(position);
holder.textViewLevel.setText(level.getLevel() + "");
if (level.getScore() != null) {
int stars = calculateStars(level.getScore()); // Используем очки текущего уровня
if (stars >= 1) holder.imgStar1.setImageResource(R.drawable.icon_level_star);
if (stars >= 2) holder.imgStar2.setImageResource(R.drawable.icon_level_star);
if (stars >= 3) holder.imgStar3.setImageResource(R.drawable.icon_level_star);
}
holder.itemView.setOnClickListener(v -> {
if (level.getLocked() == 0) {
listener.onLevelClick(level.getLevel());
}
});
}
//Расчет того, сколько звезд присвоить за прохождение уровня
private int calculateStars(int totalScore) {
int stars;
if (totalScore >= 320) { // 80% и выше от максимального
stars = 3;
} else if (totalScore >= 200) { // 50% - 79% от максимального
stars = 2;
} else if (totalScore >= 100) { // 25% - 49% от максимального
stars = 1;
} else { // Менее 25% от максимального
stars = 0;
}
return stars;
}
@Override
public int getItemCount() {
return levels.size();
}
public static class LevelViewHolder extends RecyclerView.ViewHolder {
TextView textViewLevel;
ImageView imgStar1;
ImageView imgStar2;
ImageView imgStar3;
public LevelViewHolder(@NonNull View itemView) {
super(itemView);
textViewLevel = itemView.findViewById(R.id.textViewLevel);
imgStar1 = itemView.findViewById(R.id.img_star_1);
imgStar2 = itemView.findViewById(R.id.img_star_2);
imgStar3 = itemView.findViewById(R.id.img_star_3);
}
}
}
А разметка для отдельного элемента списка таким образом:
<?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"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="2dp">
<TextView
android:id="@+id/textViewLevel"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/level_bg"
android:fontFamily="@font/toyz"
android:gravity="center"
android:text="1999"
android:textSize="20sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/img_star_1"
android:layout_width="18dp"
android:layout_height="18dp"
app:srcCompat="@drawable/icon_level_star_grey" />
<ImageView
android:id="@+id/img_star_2"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
app:srcCompat="@drawable/icon_level_star_grey" />
<ImageView
android:id="@+id/img_star_3"
android:layout_width="18dp"
android:layout_height="18dp"
app:srcCompat="@drawable/icon_level_star_grey" />
</LinearLayout>
</LinearLayout>