首页 > 解决方案 > Android FlexBox 布局仅显示固定数量的行

问题描述

我正在尝试构建一个单词到单词的 RTL 语言电子书应用程序。电子书的数据存储在 Sqlite 数据库中。经过大量搜索,我发现 Flexbox 布局适合我的需要,以便以我所需的格式显示我的数据。以下链接帮助了我:Android GridLayout with dynamic number of columns per row但问题是,如果视图中传递的数据很大,则显示部分数据。如果传递的数据很小,那么我根本没有问题。

这是适配器代码:

public class VerseAdapter extends RecyclerView.Adapter<VerseAdapter.ViewHolder> {

private List<verseItem> items;
private Context context;
wordsAdapter sAdapter;
GridLayoutManager layoutManager;

public VerseAdapter(List<verseItem> items, Context context) {
    this.items = items;
    this.context = context;
}


// This method is used to attach
// custom layout to the recycler view
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View vw = LayoutInflater.from(parent.getContext()).inflate(R.layout.verse_row, parent, false);
    return new ViewHolder(vw);
}


// This method is used to set the action
// to the widgets of our custom layout.
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    verseItem item = items.get(position);
    ArrayList<wordsModel> models = new ArrayList<>(item.getWordsModelList());
    String ayahnum = "" + item.getAyah();
    holder.ayah.setText(ayahnum);

    holder.verses_telugu.setText(item.getVerses_telugu());
    
    // FlexboxLayoutManager code:
    FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(context);
    layoutManager.setFlexDirection(FlexDirection.ROW_REVERSE);
    layoutManager.setJustifyContent(JustifyContent.FLEX_START);
    ViewHolder.wordsrecyclerView.setLayoutManager(layoutManager);
    sAdapter = new wordsAdapter(models);
    ViewHolder.wordsrecyclerView.setAdapter(sAdapter);
    sAdapter.notifyItemChanged(position);

    holder.setIsRecyclable(false);
}

@Override
public int getItemCount() {
    return items.size();
}

@Override
public int getItemViewType(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

static class ViewHolder extends RecyclerView.ViewHolder {
    TextView ayah;
    TextView verses_telugu;
    public static RecyclerView wordsrecyclerView;

    public ViewHolder(View itemView) {
        super(itemView);
        ayah = itemView.findViewById(R.id.ayah);
        verses_telugu = itemView.findViewById(R.id.telugu_line);
        wordsrecyclerView = itemView.findViewById(R.id.words_RV_id);

    }
 }

}

这是我的布局文件:

<?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="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

    <TextView
         android:id="@+id/ayah"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="start"
         android:layout_margin="5dp"
         android:textAlignment="viewStart"
         android:textColor="#27A82C"
         android:textSize="18sp"
         android:textStyle="bold" />

   <androidx.recyclerview.widget.RecyclerView
       android:id="@+id/words_RV_id"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />


   <TextView
        android:id="@+id/telugu_line"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_margin="5dp"
        android:textAlignment="textStart"
        android:textSize="16sp"
        android:textStyle="bold" />

</LinearLayout>

这是最终结果显示的实际样子:

截图1

这是我的应用程序的样子:

截图2(Part1)

截图2(Part1)

现在,如果您从屏幕截图中注意到,我尝试显示的数据是相同的。但在我的应用程序中,并非所有单词都如您所见那样显示。

我注意到的另一件事是对于更大的数据,如果屏幕方向是垂直的,我可以看到的最大行数是 10,如果它是水平的,我最多可以看到 6 行。对于所有数据较大的地方,这些行数是固定的。如果数据较小,它会以所需的确切行数显示,如前所述,我完全没有问题。

希望有人能尽快帮助我。提前致谢。(:

标签: androidandroid-recyclerviewandroid-sqliteandroid-gridlayoutandroid-flexboxlayout

解决方案


推荐阅读