根据列表中最长的文本更改ListView分隔符长度

时间:2013-07-10 12:03:47

标签: android android-listview

我一直在查看Stackoverflow上的内容,但无法了解如何执行此操作。

我想要的是这样的:

    xxxxxxxx
    --------
    xxxx
    --------
    xx

而不是通常的

    xxxxxxxx
    ----------------------------------- (until end of screen)
    xxxx
    -----------------------------------
    xx

我想知道是否有一种非常简单的方法可以做到。

我认为这涉及到改变正确的保证金,但这就是我所得到的。

我顺便在运行时创建ListViews

3 个答案:

答案 0 :(得分:1)

您应该使用自定义drawable执行类似的操作:

<ListView
  android:divider="@drawable/fancy_gradient"
  android:dividerHeight="@dimen/divider_height"...

Java方式:

list = (ListView) findViewById(R.id.list);
int[] colors = {0, 0xFF97CF4D, 0};
ListView inner = list.getRefreshableView();
inner.setDivider(new GradientDrawable(Orientation.RIGHT_LEFT, colors));
inner.setDividerHeight(1);

但似乎分隔宽度不可自定义......

答案 1 :(得分:1)

由于您无法以编程方式直接更改分隔线宽度,因此建议您编写一个带有字符串列表的适配器。适配器将由一个TextView和一个ImageView(最好)组成。

在适配器中,您可以比较字符串并获得最长的字符串。获取该最长字符串的估计宽度;

String longestText = "longestword";
Paint paint = new Paint();
float widthValue = paint.measureText(longestText);

(这将以像素为单位给出结果)并且在获得此值之后,您可以简单地在textview下放置(height = x,width = widthValue)的imageview。

然后从xml中删除listview中的分隔符;

android:divider="@android:color/transparent"

您想要的视图已准备好使用。

答案 2 :(得分:0)

我认为它能够发挥作用。它似乎工作。 我就是这样做的。

     ListAdapter listAdapter = posList.getAdapter();
                //base case
                int longestWidth = listAdapter.getView(0, null, posList).getMeasuredWidth();
                for (int i = 0; i < listAdapter.getCount(); i++) {
                    View listItem = listAdapter.getView(i, null, posList);
                    listItem.measure(0, 0);
                    //check if the items in the list are longer than base case
                    if (listItem.getMeasuredWidth() > longestWidth)
                    {
                        longestWidth = listItem.getMeasuredWidth();
                    }

                }
                ViewGroup.LayoutParams params = posList.getLayoutParams();
                //assign width of textview to longest item in the list
                params.width = longestWidth;