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

ListView 下拉刷新保持項目展開/收起狀態:在實體類加狀態標記

     編輯:程式設計綜合問答

核心思路

資料模型 (Entity) 新增 boolean isExpanded 欄位,Adapter.getView() 根據該欄位決定顯示全文或收起。下拉刷新插入新資料時,舊資料物件不變,狀態自動保留。

實體類定義

public class NewsItem {
    public String title;
    public String content;
    public boolean isExpanded = false; // 預設收起
}

Adapter 關鍵邏輯

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.item_news, parent, false);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    NewsItem item = getItem(position);
    holder.tvTitle.setText(item.title);
    holder.tvContent.setText(item.content);
    
    // 根據狀態控制顯示
    if (item.isExpanded) {
        holder.tvContent.setMaxLines(Integer.MAX_VALUE);
        holder.btnToggle.setText("收起");
    } else {
        holder.tvContent.setMaxLines(3);
        holder.btnToggle.setText("查看全文");
    }

    holder.btnToggle.setOnClickListener(v -> {
        item.isExpanded = !item.isExpanded;
        notifyItemChanged(position); // 僅刷新該項
    });
    return convertView;
}

下拉刷新插入新資料

public void onRefreshComplete(List newItems) {
    // 新資料插入列表頭部
    newsList.addAll(0, newItems);
    adapter.notifyItemRangeInserted(0, newItems.size());
    // 舊項目 isExpanded 狀態完全保留,無需額外處理
}

避坑指南

  • 不要在 getView 重建實體:確保 getItem(position) 回傳同一物件引用。
  • 使用 RecyclerView:notifyItemChanged 效能優於 notifyDataSetChanged,支援動畫。
  • 複雜狀態:若有多種狀態 (加載中、錯誤、展開),改用 enum State。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved