Как использовать RecyclerView как GridView?

#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. github.com/monsterbrain/RecyclerviewTableViewAndroid

Ответ №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 как обычно