我创建了一个名为ScrollListView的自定义组件,它基本上是一个扩展ListView的表。使用下面的函数getView,我用来自数据库的数据填充此组件。它完美地运作,结果在视觉上:
显然我希望细胞对齐,如下:
为实现这一目标,目前我执行计算以测量所有单元格大小,然后根据最宽的单元格调整列,但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...)