动态添加和删除Spinner(ArrayList与Widget的依赖性)

4.9、动态添加和删除Spinner(ArrayList与Widget的依赖性)

新建一个继承Activity类的SpinnerItemAddOrDeleteActivity,并设置布局文件为:spinneritemaddordelete.xml。

在布局文件中添加一个TextView和一个EditText,2个Button按钮。

    <TextView

        android:id="@+id/spinneritemaddordelete_tv01"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center_horizontal"

        android:text="@string/show_information"

        android:textSize="20sp" />

 

    <EditText

        android:id="@+id/spinneritemaddordelete_edit01"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content" />

 

 

    <Button

        android:id="@+id/spinneritemaddordelete_btn01"

        style="@android:style/Widget.Button.Inset"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/add01" />

 

    <Button

        android:id="@+id/spinneritemaddordelete_btn02"

        style="@android:style/Widget.Button.Inset"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/delete" />

 

    <Spinner

        android:id="@+id/spinneritemaddordelete_spinner"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:entries="@array/spinnerItem"

        android:prompt="@string/spinnersetdropdownviewresource_spinner_prompt"

        android:spinnerMode="dialog" />

而后在Activity类中获取这些组件。

 

package lyx.feng.second;

 

import java.util.ArrayList;

import java.util.List;

 

import lyx.feng.simpletextdemo.R;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemSelectedListener;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Spinner;

import android.widget.TextView;

 

public class SpinnerItemAddOrDeleteActivity extends Activity {

    private TextView tv = null;

    private EditText edit = null;

    private Button add = null;

    private Button delete = null;

    private Spinner spinner = null;

    private ArrayAdapter<String> adapter = null;

    private String item[];

    private List<String> lists = new ArrayList<String>();

 

    @SuppressWarnings("unchecked")

    @Override

    protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       super.setContentView(R.layout.spinneritemaddordelete);

       this.tv = (TextView) super

              .findViewById(R.id.spinneritemaddordelete_tv01);

       this.edit = (EditText) super

              .findViewById(R.id.spinneritemaddordelete_edit01);

       this.add = (Button) super

              .findViewById(R.id.spinneritemaddordelete_btn01);

       this.delete = (Button) super

              .findViewById(R.id.spinneritemaddordelete_btn02);

       this.spinner = (Spinner) super

              .findViewById(R.id.spinneritemaddordelete_spinner);

 

       this.item = getResources().getStringArray(R.array.spinnerItem);

       for (int i = 0; i < item.length; i++) {

           lists.add(item[i]);

       }

       this.adapter = (ArrayAdapter<String>) this.spinner.getAdapter();

       this.adapter = new ArrayAdapter<String>(this,

              android.R.layout.simple_spinner_dropdown_item, this.lists);

       this.spinner.setAdapter(adapter);

      

       this.add.setOnClickListener(new OnClickListener() {

 

           @Override

           public void onClick(View v) {

              for (int i = 0; i < adapter.getCount(); i++) {

                  if (edit.getText().toString().trim()

                         .equals(adapter.getItem(i))) {

                     return;

                  }

              }

              if (edit.getText().toString().trim().equals("")) {

                  return;

              }

              tv.setText("你添加的是:" + edit.getText().toString());

              adapter.add(edit.getText().toString());

              edit.setText("");

           }

       });

       this.delete.setOnClickListener(new OnClickListener() {

 

           @Override

           public void onClick(View v) {

              if (adapter.getCount() > 0) {

                  tv.setText("你删除的是:" + spinner.getSelectedItem().toString());

                  adapter.remove(spinner.getSelectedItem().toString());

              }

           }

       });

       this.spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

 

           @Override

           public void onItemSelected(AdapterView<?> parent, View view,

                  int position, long id) {

              tv.setText("你选择的是:" + adapter.getItem(position).toString());

           }

 

           @Override

           public void onNothingSelected(AdapterView<?> parent) {

 

           }

       });

    }

}

 

注意这里要使用List集合,否则在使用ArrayAdapter类的add或者removed方法的时候会报错。

package com.example.kucun2.function; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.example.kucun2.entity.Bancai; import com.example.kucun2.entity.Caizhi; import com.example.kucun2.entity.Chanpin; import com.example.kucun2.entity.Dingdan; import com.example.kucun2.entity.Mupi; import com.example.kucun2.entity.Zujian; import java.util.ArrayList; import java.util.List; public class Adapter { // 安全适配器基类,处理公共逻辑 // 安全适配器基类,处理公共逻辑 private static abstract class SafeSpinnerAdapter<T> extends ArrayAdapter<T> { private static final String TAG = "SafeSpinnerAdapter"; private final LayoutInflater inflater; private final String defaultText; public SafeSpinnerAdapter(Context context, int resource, List<T> objects, String defaultText) { super(context, resource, objects); this.inflater = LayoutInflater.from(context); this.defaultText = defaultText != null ? defaultText : "请选择"; } @Override public int getCount() { return super.getCount() + 1; // 增加一个默认项 } @Override public T getItem(int position) { return position == 0 ? null : super.getItem(position - 1); } @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { if (parent == null) { Log.w(TAG, "Parent is null in getDropDownView"); return new TextView(getContext()); } if (convertView == null) { convertView = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false); } TextView textView = convertView.findViewById(android.R.id.text1); if (position == 0) { textView.setText(defaultText); } else { T item = getItem(position); textView.setText(item != null ? formatDropdownText(item) : ""); } return convertView; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { if (parent == null) { Log.w(TAG, "Parent is null in getView"); return new TextView(getContext()); } if (convertView == null) { convertView = inflater.inflate(android.R.layout.simple_spinner_item, parent, false); } TextView textView = convertView.findViewById(android.R.id.text1); if (position == 0) { textView.setText(defaultText); } else { T item = getItem(position); textView.setText(item != null ? formatDisplayText(item) : ""); } return convertView; } protected abstract String formatDisplayText(T item); protected abstract String formatDropdownText(T item); } // 1. 材质适配器 public static ArrayAdapter<Caizhi> setupCaizhiSpinner(Spinner spinner, List<Caizhi> data, Context context) { ArrayAdapter<Caizhi> adapter = new SafeSpinnerAdapter<Caizhi>( context, android.R.layout.simple_spinner_item, data, "请选择材质" ) { @Override protected String formatDisplayText(Caizhi item) { return item != null ? item.getName() : ""; } @Override protected String formatDropdownText(Caizhi item) { return item != null ? item.getName() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(0); // 默认选中"请选择" return adapter; } // 2. 木皮适配器 public static void setupMupiSpinner(Spinner spinner, List<Mupi> data, Context context) { ArrayAdapter<Mupi> adapter = new SafeSpinnerAdapter<Mupi>( context, android.R.layout.simple_spinner_item, data, "请选择木皮" ) { @Override protected String formatDisplayText(Mupi item) { return item != null ? item.formatMupiDisplay() : ""; } @Override protected String formatDropdownText(Mupi item) { return item != null ? item.formatMupiDisplay() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(0); // 默认选中"请选择" } // 3. 板材适配器 public static void setupBancaiSpinners(Spinner spinner, List<Bancai> data, Context context) { ArrayAdapter<Bancai> adapter = new SafeSpinnerAdapter<Bancai>( context, android.R.layout.simple_spinner_item, data, "请选择板材" ) { @Override protected String formatDisplayText(Bancai item) { return item != null ? item.TableText() : ""; } @Override protected String formatDropdownText(Bancai item) { return item != null ? item.TableText() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(0); // 默认选中"请选择" } // 4. 订单适配器 public static void setupDingdanSpinner(Spinner spinner, List<Dingdan> data, Context context) { ArrayAdapter<Dingdan> adapter = new SafeSpinnerAdapter<Dingdan>( context, android.R.layout.simple_spinner_item, data, "请选择订单" ) { @Override protected String formatDisplayText(Dingdan item) { return item != null ? item.getNumber() : ""; } @Override protected String formatDropdownText(Dingdan item) { return item != null ? item.getNumber() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(0); // 默认选中"请选择" } // 5. 产品适配器 public static void setupChanpinSpinner(Spinner spinner, List<Chanpin> data, Context context) { ArrayAdapter<Chanpin> adapter = new SafeSpinnerAdapter<Chanpin>( context, android.R.layout.simple_spinner_item, data, "请选择产品" ) { @Override protected String formatDisplayText(Chanpin item) { return item != null ? item.getBianhao() : ""; } @Override protected String formatDropdownText(Chanpin item) { return item != null ? item.getBianhao() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(0); // 默认选中"请选择" } // 6. 组件适配器 public static void setupZujianSpinner(Spinner spinner, List<Zujian> data, Context context) { ArrayAdapter<Zujian> adapter = new SafeSpinnerAdapter<Zujian>( context, android.R.layout.simple_spinner_item, data, "请选择组件" ) { @Override protected String formatDisplayText(Zujian item) { return item != null ? item.getName() : ""; } @Override protected String formatDropdownText(Zujian item) { return item != null ? item.getName() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(0); // 默认选中"请选择" } // 1. 新增支持筛选的适配器基类 /** * 新增支持筛选的适配器基类 * @param <T> */ public static abstract class FilterableAdapter<T> extends ArrayAdapter<T> implements Filterable { private static final String TAG = "FilterableAdapter"; private final LayoutInflater inflater; private List<T> originalList; private List<T> filteredList; private final String defaultText; private final ItemFilter filter = new ItemFilter(); public FilterableAdapter(Context context, int resource, List<T> objects, String defaultText) { super(context, resource, objects); this.inflater = LayoutInflater.from(context); this.originalList = new ArrayList<>(objects); this.filteredList = new ArrayList<>(objects); this.defaultText = defaultText != null ? defaultText : "请选择"; } public FilterableAdapter(Context context, int resource, List<T> objects) { super(context, resource, objects); this.inflater = LayoutInflater.from(context); this.originalList = new ArrayList<>(objects); this.filteredList = new ArrayList<>(objects); this.defaultText = "请选择"; } @Override public int getCount() { return filteredList.size() + 1; // 增加默认项 } @Override public T getItem(int position) { return position == 0 ? null : filteredList.get(position - 1); // 位置偏移处理 } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(android.R.layout.simple_spinner_item, parent, false); } TextView textView = convertView.findViewById(android.R.id.text1); if (position == 0) { textView.setText(defaultText); // 默认提示文本 } else { T item = getItem(position); textView.setText(item != null ? formatDisplayText(item) : ""); } return convertView; } @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false); } TextView textView = convertView.findViewById(android.R.id.text1); if (position == 0) { textView.setText(defaultText); // 下拉框中的默认提示 } else { T item = getItem(position); textView.setText(item != null ? formatDropdownText(item) : ""); } return convertView; } public void updateList(List<T> newList) { this.originalList = new ArrayList<>(newList); this.filteredList = new ArrayList<>(newList); notifyDataSetChanged(); } @Override public Filter getFilter() { return filter; } // 必须实现的抽象方法 protected abstract String formatDisplayText(T item); protected abstract String formatDropdownText(T item); private class ItemFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); List<T> filtered = new ArrayList<>(); if (constraint == null || constraint.length() == 0) { // 无筛选条件时包含所有项 filtered.addAll(originalList); } else { String filterPattern = constraint.toString().toLowerCase().trim(); for (T item : originalList) { if (formatDisplayText(item).toLowerCase().contains(filterPattern)) { filtered.add(item); } } } results.values = filtered; results.count = filtered.size(); return results; } @Override @SuppressWarnings("unchecked") protected void publishResults(CharSequence constraint, FilterResults results) { filteredList = (List<T>) results.values; if (results.count > 0 || constraint == null || constraint.length() == 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } } } // /** * 为订单创建筛选适配器 * @param context * @param data * @return */ public static FilterableAdapter<Dingdan> createDingdanFilterableAdapter( Context context, List<Dingdan> data) { return new FilterableAdapter<Dingdan>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Dingdan item) { return item != null ? item.getNumber() : ""; } @Override protected String formatDropdownText(Dingdan item) { return item != null ? item.getNumber() : ""; } }; } // 为产品创建筛选适配器 public static FilterableAdapter<Chanpin> createChanpinFilterableAdapter( Context context, List<Chanpin> data) { return new FilterableAdapter<Chanpin>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Chanpin item) { return item != null ? item.getBianhao() : ""; } @Override protected String formatDropdownText(Chanpin item) { return item != null ? item.getBianhao() : ""; } }; } // 为组件创建筛选适配器 public static FilterableAdapter<Zujian> createZujianFilterableAdapter( Context context, List<Zujian> data) { return new FilterableAdapter<Zujian>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Zujian item) { return item != null ? item.getName() : ""; } @Override protected String formatDropdownText(Zujian item) { return item != null ? item.getName() : ""; } }; } // 为板材创建筛选适配器 public static FilterableAdapter<Bancai> createBancaiFilterableAdapter( Context context, List<Bancai> data) { return new FilterableAdapter<Bancai>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Bancai item) { return item != null ? item.TableText() : ""; } @Override protected String formatDropdownText(Bancai item) { return item != null ? item.TableText() : ""; } }; } } 在FilterableAdapter中直接输出标准格式文字
最新发布
07-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值