ListView与textViews动态水平填充

时间:2017-05-01 14:40:37

标签: android listview

如下所示声明的简单列表视图垂直列出与其适配器关联的文本。

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/itemsListView">
</ListView>

我需要一个水平包裹的可变数量项目的视图,其项目在运行时决定(如下图所示)。我如何实现这一目标?

horizontally wrapped text views

5 个答案:

答案 0 :(得分:5)

使用Google全新的FlexboxLayout及其flexWrap:

https://github.com/google/flexbox-layout

答案 1 :(得分:3)

尝试

1. 为recyclerview添加弹性框依赖性

compile 'com.google.android:flexbox:0.3.0-alpha3'

2. 请按照与recyclerview

进行Flexbox集成的步骤进行操作

https://github.com/google/flexbox-layout/blob/dev_recyclerview/RecyclerView.md

3. 使用以下方法为recyclerview设置弹性框属性:

FlexboxLayoutManager layoutManager = new FlexboxLayoutManager();
layoutManager.setFlexDirection(FlexDirection.COLUMN);
layoutManager.setJustifyContent(JustifyContent.FLEX_END);

Flexbox与RecyclerView集成的注意事项

  

新的FlexboxLayoutManager的代码尚未合并到主分支,因为它不像现有的FlexboxLayout那样稳定。但您仍然可以使用dev_recyclerview分支中的RecyclerView内的FlexboxLayoutManager引用一些示例代码

有关详情:https://github.com/google/flexbox-layout

答案 2 :(得分:2)

您可以将RecycleView与StaggeredGridLayoutManager一起使用(int spanCount,int orientation)。

mRecycleView = (RecyclerView) findViewById(R.id.rv_tags);
mRecycleView.setLayoutManager(new StaggeredGridLayoutManager(2,1));

然后使用列表项setAdapter。

答案 3 :(得分:1)

据我所知,您的单元格可以表示为A RelativeLayout,其中内部为LinearLayout水平。所有文本对象(TextView或更复杂的东西)都插入到LinearLayout中。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="wrap_content">

    <LinearLayout
    android:id="@+id/container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:orientation="horizontal" />

</RelativeLayout>

在适配器中,您必须绑定此布局中的内容。 如果LinearLayout包含的TextObject超出了所需的数量,则必须删除超出,否则必须根据需要添加任意数量的TextObject。 逻辑应如下:

 int currentChildCount = holder.textContainer.getChildCount();    
    if(currentChildCount >item.getSubtasks().size()){
        for (int i = 0; i < (holder.textContainer.getChildCount() - < TOTAL_TEXTS >; i++) {
            holder.textContainer.removeView(holder.textContainer.getChildAt(holder.text.getChildCount() - 1));
        }
    } else {
        for (int i = 0; i < ( < TOTAL_TEXTS > -currentChildCount) ; i++){
            holder.textContainer.addView(LayoutInflater.from(context).inflate(R.layout.item_list_text_child, null, false));
        }
    }

最后,您必须更新textObjects的内容:

for (int i=0; i<holder.textContainer.getChildCount();i++){
        ArrayList<String> textContents =<YOUR_TEXTS>;
        composeChildTaskView(context,textContents.get(i),holder.textContainer.getChildAt(i));
}

我希望它有所帮助。

答案 4 :(得分:1)

使用compile 'com.google.android:flexbox:0.3.0-alpha3'

recyclerView.setLayoutManager(new FlexboxLayoutManager());

请参阅https://github.com/google/flexbox-layout

enter image description here