資料模型 (Entity) 新增 boolean isExpanded 欄位,Adapter.getView() 根據該欄位決定顯示全文或收起。下拉刷新插入新資料時,舊資料物件不變,狀態自動保留。
public class NewsItem {
public String title;
public String content;
public boolean isExpanded = false; // 預設收起
}
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 狀態完全保留,無需額外處理
}
getItem(position) 回傳同一物件引用。notifyItemChanged 效能優於 notifyDataSetChanged,支援動畫。enum State。