首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 自定義 ListView 固定頭部尾部、中間項目可滑動的組合控件實現

     編輯:程式設計疑難解答

需求分析

實現類似「列表頂部固定標題、底部固定按鈕、中間數據列表可滑動」的界面,要求封裝為單一可復用 View。

推薦架構:組合控件模式

不繼承 `ListView` 重寫佈局,而是構建一個垂直 `LinearLayout` 容器,內含三個子 View:

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

    <!-- 固定頭部 -->
    <ViewStub /> 或 <include layout="@layout/header" />

    <!-- 中間可滑動列表 (核心) -->
    <ListView
        android:id="@+id/list_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <!-- 固定尾部 -->
    <include layout="@layout/footer" />

</LinearLayout>

封裝為自定義 View 類


public class FixedHeaderFooterListView extends LinearLayout {
    private ListView listView;
    private View headerView, footerView;

    public FixedHeaderFooterListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context) {
        setOrientation(VERTICAL);
        LayoutInflater.from(context).inflate(R.layout.fixed_header_footer_list, this, true);
        listView = findViewById(R.id.list_content);
        headerView = findViewById(R.id.header_container);
        footerView = findViewById(R.id.footer_container);
    }

    // 對外暴露 ListView 核心功能
    public void setAdapter(ListAdapter adapter) { listView.setAdapter(adapter); }
    public void setOnItemClickListener(AdapterView.OnItemClickListener l) { listView.setOnItemClickListener(l); }
    public ListView getListView() { return listView; }

    // 設置自定義頭部/尾部 View
    public void setHeaderView(View view) {
        ViewGroup container = findViewById(R.id.header_container);
        container.removeAllViews();
        container.addView(view);
    }
    public void setFooterView(View view) { /* 類似實現 */ }
}

關鍵優勢

  • 零侵入:不修改 `ListView` 源碼,兼容所有 `ListView` 特性(分割線、選擇器、滑動監聽等)。
  • 靈活性高:頭部/尾部可隨時動態替換為任意複雜布局。
  • 性能好:無額外測量繪製開銷,`layout_weight="1"` 自動分配剩餘空間給列表。

進階:頭部尾部隨列表滑動(吸頂/吸底)

若需頭部尾部也能滑動但達到邊緣時固定,請使用 `RecyclerView` + `StickyHeaderItemDecoration` 或第三方庫(如 `SmartRefreshLayout`),原生 `ListView` 實現極其複雜且有缺陷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved