#android #android-recyclerview
#Android #android-recyclerview
Вопрос:
Моя БД такая.
Я покажу вам ДАННЫЕ, когда буду искать свое имя в SearchView.
Это макет адаптера.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@ id/nameText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_green_light"
android:gravity="center"
android:text="Name"
android:textColor="@android:color/white"
android:textSize="30sp" />
<TextView
android:id="@ id/dataText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_light"
android:gravity="center"
android:text="Data No."
android:textColor="@android:color/white"
android:textSize="20sp" />
</LinearLayout>
Один nameText и один DataText.
Если я буду искать JOHN1, я бы хотел, чтобы он выглядел так.
Как GridView.
JOHN1 JOHN1 JOHN1 JOHN1
10 20 30 40
Но я не знаю, что делать с onBindViewHolder адаптера.
Это адаптер.
public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {
List<Data> dataList;
Context context;
public Adapter(List<Data> dataList, Context context) {
this.dataList = dataList;
this.context = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
// holder.nameText.setText(dataList.get(position).getName());
// holder.dataText.setText(dataList.get(position).getData1());
// holder.dataText.setText(dataList.get(position).getData2());
// holder.dataText.setText(dataList.get(position).getData3());
// holder.dataText.setText(dataList.get(position).getData4());
}
@Override
public int getItemCount() {
return dataList.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView nameText, dataText;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
nameText = itemView.findViewById(R.id.nameText);
dataText = itemView.findViewById(R.id.dataText);
}
}
}
Пожалуйста, помогите мне…
Комментарии:
Ответ №1:
Структура, подобная таблице, является очень старым шаблоном и не принимается в соответствии с рекомендациями по проектированию. Предлагается использовать одну карту с несколькими textviews
данными, которые можно установить с помощью метода viewHolder
in onBindViewHolder
.
Проверьте эту ссылку на наличие карточек
Проверьте эту ссылку, чтобы узнать, как создать макет на основе карточек
Вы можете использовать a Staggered
или a Grid
Layout Manager
для вашего RecyclerView
, что даст вам хороший вид для отображения данных.
Вы можете проверить оба стиля в этой статье
Теперь, если все это вас не убеждает, и вы хотите придерживаться упомянутого вами дизайна, тогда у вас может быть ViewHolder
LinearLayout
horizontal
ориентация with и, в которой вы можете add
view
title
description
динамически использовать with и, зацикливаясь на объекте и устанавливая значения title
and description
. Заголовок в этом случае будет повторяющимся и займет ненужное место на экране в соответствии с дизайном.Поэтому не рекомендуется использовать этот дизайн.
Дайте мне знать, если это поможет.
Ответ №2:
вы можете использовать держатели нескольких типов
хороший пример здесь: образец
Комментарии:
1. вы можете использовать держатели нескольких типов
2. Извините, но я не понимаю. Есть только один POJO, и я использую getItemViewType?
3. да, для строк используйте какой-то держатель
NameHolder
, а дляint
значений используйте какой-то держатель, напримерAgeHolder
4. Это нормально, если это все строковое значение?
5. нет, вы можете использовать для всех типов данных, заблокировать образец, это действительно полезно
Ответ №3:
Чтобы использовать RecyclerView
, как GridView
:
mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), NUMBER_OF_COLUMN));
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.setAdapter(mAdapter);
Но в вашем случае я видел, что ваш database
хранится как 1 объект response
, содержащий name
, data1
, data2
, data3
, data4
поля.
{
"response":{
"name":"John",
"data1":10,
"data2":20,
"data3":30,
"data4":40
}
}
Если вы хотите отображать как
JOHN1 JOHN1 JOHN1 JOHN1
10 20 30 40
НЕ используйте Gridlayout
. Gridlayout
следует использовать, если ваши данные похожи
{
"response":[
{
"name":"John",
"data":10
},
{
"name":"John",
"data":20
},
{
"name":"John",
"data":30
},
{
"name":"John",
"data":40
}
]
}
Конечно, вы можете преобразовать свой объект response
в объект массива, как показано ниже json, но в этом нет необходимости. Лучше просто использовать RecyclerView
как обычно