Android自定义组件 - 如何自动修复列的宽度

时间:2014-08-13 19:39:33

标签: android listview gridview garbage-collection adapter

我创建了一个名为ScrollListView的自定义组件,它基本上是一个扩展ListView的表。使用下面的函数getView,我用来自数据库的数据填充此组件。它完美地运作,结果在视觉上:

result

显然我希望细胞对齐,如下:

cells aligned

为实现这一目标,目前我执行计算以测量所有单元格大小,然后根据最宽的单元格调整列,但GC会多次调用,导致滚动时出现延迟,如前所述[{3}}

我的问题是:如何自动修复/测量列的大小,而不是在每个getView调用中调用疯狂的计算,熄灭所有这些GC事件?我试图扩展GridView而不是ListView,但它没有用。我是Android新手。

(我不能使用标准组件,例如GridView或GridLayout,我必须使用我的自定义组件ScrollListView,因为当前正常运行的其他更复杂的功能)

提前致谢并抱歉我的英文不好

编辑:这是我的代码(getView代码在已经提到的线程中):

scroll_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:background="@color/BackGroundColor"
    android:scrollbars="none" >

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:gravity="center_horizontal">

    <TableLayout
        android:id="@+id/header_lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:gravity="center_horizontal">
    </TableLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >

        <android.ListView
             android:id="@+id/rows_lv"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_margin="0dip"
             android:divider="@null"
             android:dividerHeight="0dp"
             android:padding="0dip"
             android:scrollbars="horizontal"
             android:gravity="center_horizontal"
             android:stretchColumns="*"
             />
    </LinearLayout>

    </LinearLayout>

</HorizontalScrollView>

我的ScrollListView.java

  public class ScrollListView extends LinearLayout
{

    TableLayout header;
    ListView rows;
    public ScrollListView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view=layoutInflater.inflate(R.layout.scroll_listview,this);

        if (!this.isInEditMode())
        {
            rows = (ListView)this.findViewById(R.id.rows_lv);
            header = (TableLayout)this.findViewById(R.id.header_lv);
            rows.setOnRedrawListener(new OnListViewRedraw() {


                @Override
                public void onBeforeRedraw() {

                }

                @Override
                public void onAfterRedraw() {
                }

            });
            rows.setHeader(header);
            rows.setMyParent(this);
        }

    // (and so on...)

1 个答案:

答案 0 :(得分:0)

查看TableLayout.onMeasure()源代码。他们找到所有孩子的细胞宽度,然后调整所有孩子以相应地匹配。您需要一些修改后的版本才能满足您的需求。