ListView 僅供顯示資料,不希望項目被點選、無選取狀態變色、無點擊回饋。
public class NonSelectableAdapter extends ArrayAdapter {
public NonSelectableAdapter(Context context, int resource, List items) {
super(context, resource, items);
}
// 關鍵:所有項目均不可啟用 (不可點選)
@Override public boolean areAllItemsEnabled() {
return false;
}
@Override public boolean isEnabled(int position) {
return false;
}
}
// 使用
ListView listView = findViewById(R.id.list_view);
listView.setAdapter(new NonSelectableAdapter(this, R.layout.item_layout, data));
android:focusable="false"
android:focusableInTouchMode="false"
android:background="@android:color/transparent">
同時在 ListView XML:
ListView listView = findViewById(R.id.list_view);
listView.setClickable(false);
listView.setFocusable(false);
listView.setFocusableInTouchMode(false);
listView.setSelector(new ColorDrawable(Color.TRANSPARENT)); // 移除選取效果
listView.setOnItemClickListener(null); // 移除點擊監聽
public class MixedAdapter extends ArrayAdapter- {
@Override public boolean isEnabled(int position) {
Item item = getItem(position);
return item != null && item.isClickable(); // 根據資料決定
}
@Override public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if (!isEnabled(position)) {
view.setAlpha(0.5f); // 視覺提示不可點選
view.setClickable(false);
} else {
view.setAlpha(1.0f);
}
return view;
}
}
// Adapter 中
@Override public void onBindViewHolder(ViewHolder holder, int position) {
Item item = items.get(position);
holder.bind(item);
// 控制點擊
holder.itemView.setOnClickListener(item.isClickable() ? clickListener : null);
holder.itemView.setAlpha(item.isClickable() ? 1.0f : 0.5f);
holder.itemView.setClickable(item.isClickable());
holder.itemView.setFocusable(item.isClickable());
}
areAllItemsEnabled() + isEnabled() 最乾淨listSelector="@android:color/transparent" + 項目背景透明onBindViewHolder 中動態控制 setOnClickListener 與 setClickable