Android开发:如何设置Spinner选中项的ImageView为VISIBLE、未选中为GONE
实现步骤
1. 修改FruitAdapter适配器
新增选中位置存储变量、更新选中位置的方法,在getView中根据选中状态控制图标可见性:
public class FruitAdapter extends BaseAdapter { private Context context; private List<Fruit> fruitList; // 存储当前选中的位置,默认-1表示无选中 private int selectedPosition = -1; public FruitAdapter(Context context, List<Fruit> fruitList) { this.context = context; this.fruitList = fruitList; } // 供外部调用更新选中位置 public void setSelectedPosition(int position) { this.selectedPosition = position; // 刷新列表更新所有项的状态 notifyDataSetChanged(); } @Override public int getCount() { return fruitList != null ? fruitList.size() : 0; } @Override public Object getItem(int i) { // 修正原代码的错误,返回对应位置的数据项而非索引 return fruitList.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { View rootView = LayoutInflater.from(context) .inflate(R.layout.item_fruit, viewGroup, false); TextView txtName = rootView.findViewById(R.id.name); ImageView image = rootView.findViewById(R.id.image); ImageView selected = rootView.findViewById(R.id.selected); txtName.setText(fruitList.get(i).getName()); image.setImageResource(fruitList.get(i).getImage()); // 根据选中状态控制图标可见性 selected.setVisibility(i == selectedPosition ? View.VISIBLE : View.GONE); return rootView; } }
2. 修改MainActivity添加选中监听
给Spinner绑定选中事件回调,将选中位置传递给适配器:
public class MainActivity extends AppCompatActivity implements CustomSpinner.OnSpinnerEventsListener{ private CustomSpinner spinner_fruits; private FruitAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); spinner_fruits = findViewById(R.id.spinner_fruits); spinner_fruits.setSpinnerEventsListener(this); adapter = new FruitAdapter(MainActivity.this, Data.getFruitList()); spinner_fruits.setAdapter(adapter); // 新增Spinner选项选中监听 spinner_fruits.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { adapter.setSelectedPosition(position); } @Override public void onNothingSelected(AdapterView<?> parent) { adapter.setSelectedPosition(-1); } }); } @Override public void onPopupWindowOpened(Spinner spinner) { spinner_fruits.setBackground(getResources().getDrawable(R.drawable.bg_spinner_fruit_up)); } @Override public void onPopupWindowClosed(Spinner spinner) { spinner_fruits.setBackground(getResources().getDrawable(R.drawable.bg_spinner_fruit)); } }
可选优化
可以给getView添加ViewHolder复用逻辑,避免每次渲染项都重新inflate布局,提升列表滑动流畅度。
内容的提问来源于stack exchange,提问作者Android
相关产品推荐
相关产品推荐

