Как отобразить элементы в линейном макете в два столбца - PullRequest
0 голосов
/ 11 ноября 2019

Я работаю над приложением, и в разделе приложения отображаются выбранные элементы. Например, языки. Прямо сейчас языки отображаются в линейном макете, где вы можете иметь только один элемент в строке. Я хочу изменить это так, чтобы я мог показывать 2 языка в одном ряду. так что это означает два столбца:

I want to display it like that without the seperators

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Я вам в этом могу помочь.

    layoutManager = new GridLayoutManager(context, 2, RecyclerView.VERTICAL, false);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(adapter);
0 голосов
/ 11 ноября 2019

Поскольку ваши данные являются динамическими, я рекомендую вам использовать RecyclerView с GridLayoutManager и spanCount из 2.

Макет вашего элемента довольно прост (просто TextView), ноВы можете использовать эту технику с более сложными макетами предметов (например, карты, изображения + ярлыки и т. д.):

image

There are many steps, but it's something you will use a lot, and every RV follows the same pattern:

  1. Layout for 1 item
  2. RV ViewHolder (matching item layout)
  3. Data Model (you can just use String)
  4. RV Adapter (just follow the pattern)
  5. Activity layout (with an RV)
  6. Activity onCreate (to setup the adapter)

Note: there are 3 choices for the LayoutManager

  • LinearLayoutManager
  • GridLayoutManager (we'll use this)
  • StaggeredGridLayoutManager

1. item_language.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <!-- Width and Height must be wrap -->

    <TextView
        android:id="@+id/languageName"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:text="@tools:sample/cities" />
        <!-- there are only a few @tools:sample choices available -->

</androidx.constraintlayout.widget.ConstraintLayout>

2. LanguageViewHolder

class LanguageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    // Matches views in item_language.xml
    private val languageName = itemView.languageName

    fun bind(language: String) {
        languageName.text = language
    }

}

4. LanguagesAdapter

class LanguagesAdapter(private val data: List<String>) :
    RecyclerView.Adapter<LanguageViewHolder>() {

    override fun getItemCount() = data.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
        LayoutInflater.from(parent.context)
            .inflate(R.layout.item_language, parent, false)
            .let { LanguageViewHolder(it) }

    override fun onBindViewHolder(holder: LanguageViewHolder, position: Int) =
        holder.bind(data[position])

}

5. activity_my.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MyActivity">

    <!-- the rest of your layout -->

    <!-- set Orientation, LayoutManager, and SpanCount in your XML -->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/languagesGrid"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="16dp"
        app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
        app:spanCount="2"
        tools:listitem="@layout/item_language" />

</androidx.constraintlayout.widget.ConstraintLayout>

6. MyActivity onCreate

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_grid)

    val languages = listOf("English", "Chinese", "Spanish", "German", "French")
    languagesGrid.adapter = LanguagesAdapter(languages)
}
...