在 `getView()` 中呼叫 `viewHolder.ivLogo.setVisibility(View.VISIBLE)` 無效,控件不隱藏/顯示。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.grid_item, parent, false);
holder = new ViewHolder();
holder.ivLogo = convertView.findViewById(R.id.iv_logo);
holder.tvName = convertView.findViewById(R.id.tv_name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ItemData item = getItem(position);
holder.tvName.setText(item.name);
// 關鍵:根據條件**明確設定兩種狀態**
if (item.showLogo) {
holder.ivLogo.setVisibility(View.VISIBLE);
holder.ivLogo.setImageResource(item.logoRes);
} else {
holder.ivLogo.setVisibility(View.GONE); // 或 INVISIBLE
}
return convertView;
}
// ❌ 錯誤:只處理 true 情況,false 時沒有重置,導致重用時殘留上一個 item 的狀態
if (item.showLogo) {
holder.ivLogo.setVisibility(View.VISIBLE);
}
// 缺少 else 分支
// 使用 ViewPropertyAnimator (API 12+)
if (show) {
holder.ivLogo.setAlpha(0f);
holder.ivLogo.setVisibility(View.VISIBLE);
holder.ivLogo.animate().alpha(1f).setDuration(200).start();
} else {
holder.ivLogo.animate().alpha(0f).setDuration(200)
.withEndAction(() -> holder.ivLogo.setVisibility(View.GONE))
.start();
}
**核心原則**:`getView` 中**每個條件分支都要完整設定可見狀態**,配合 `ViewHolder` 複用,即可穩定控制子控件顯示/隱藏。