struts1、struts2 遍历map<String,List<TItem>>

strus1:

<logic:present name="itemMap">
                                    <logic:iterate id="category" name="itemMap">
                                        <h2>
                                            <input name="someMer" type="checkbox" value=""
                                                class="someMer" />
                                            <span class="c_orange"><bean:write name="category" property="key"/>
                                            </span>
                                        </h2>
                                        <logic:present name="category">
                                            <logic:iterate id="item" name="category" property="value" type="com.viewat.ewanshang.po.shop.Titem">
                                            <span><input name="merchantIds" type="checkbox"
                                                    
                                                    value="${item.fid}" class="merchantIds" />&nbsp;${item.fitemName}
                                            </span>
                                            </logic:iterate>
                                        </logic:present>        
                                    </logic:iterate>
                                </logic:present>   
 


strus2:

<s:iterator value="merchantMap.keySet()" id="key">
                                    <div class="lanmuChoose">
                                        <s:iterator value="merchantMap.get(#key)" id="mer" status="st">
                                            <s:if test="#st.index==0">
                                                <h2>
                                                    <input name="someMer" type="checkbox" value=""
                                                        class="someMer" />
                                                    <span class="c_orange"><s:property value="#key" />
                                                    </span>
                                                </h2>
                                            </s:if>
                                            <span><input name="merchantIds" type="checkbox"
                                                    <s:if test="#mer.isCheck==0">checked="checked"</s:if>
                                                    value="${mer.fid}" class="merchantIds" />&nbsp;${mer.fmerchantName}
                                            </span>
                                        </s:iterator>
                                    </div>
                                </s:iterator>



package com.example.kucun2.entity.data; import android.util.Log; import androidx.annotation.NonNull; import com.google.gson.Gson; import java.io.IOException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import okhttp3.Call; import okhttp3.Callback; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; /** * 支持数据变更自动同步的泛型集合类 * @param <T> 继承自 SynchronizableEntity 的实体类型 */ public class SynchronizedList<T extends SynchronizableEntity> implements List<T> { private final List<T> list = new ArrayList<>(); private final OkHttpClient client = new OkHttpClient(); private static final Gson gson = new Gson(); private static final MediaType JSON = MediaType.get("application/json; charset=utf-8"); private final Class<T> entityClass; // 类型标记 // 添加批量操作模式标志 private boolean batchMode = false; // 属性变更监听器 private final List<PropertyChangeListener<T>> listeners = new ArrayList<>(); public SynchronizedList(Class<T> entityClass) { Type superClass = getClass().getGenericSuperclass(); ParameterizedType type = (ParameterizedType) superClass; Type[] typeArgs = type.getActualTypeArguments(); this.entityClass = (Class<T>) typeArgs[0]; } // 安全的类型转换方法 private T safeCast(Object o) { if (o != null && entityClass.isInstance(o)) { return entityClass.cast(o); } return null; } public interface PropertyChangeListener<T> { void onPropertyChange(T entity, String propertyName, Object oldValue, Object newValue); } public void addPropertyChangeListener(PropertyChangeListener<T> listener) { listeners.add(listener); } public void removePropertyChangeListener(PropertyChangeListener<T> listener) { listeners.remove(listener); } /** * 同步实体到后端 * @param entity 要同步的实体 */ private void syncEntity(T entity) { if (batchMode) return; String endpoint = entity.getEndpoint("add"); // 从实体类获取API端点 String json = gson.toJson(entity); RequestBody body = RequestBody.create(json, JSON); Request request = new Request.Builder() .url(endpoint) .put(body) // 使用PUT更新实体 .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { Log.e("SynchronizedList", "同步失败: " + entity.getClass().getSimpleName(), e); } @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if (!response.isSuccessful()) { Log.e("SynchronizedList", "同步失败: " + response.code() + " - " + response.message()); } response.close(); } }); } // 添加用于批量操作的方法 public void beginBatch() { this.batchMode = true; } public void endBatch() { this.batchMode = false; // 批量结束后触发一次全量同步 syncAllEntities(); } private void syncAllEntities() { for (T entity : list) { syncEntity(entity); } } /** * 创建代理对象,用于监听属性变更 */ private T createProxy(T original) { if (!entityClass.isInstance(original)) { throw new IllegalArgumentException("Invalid entity type"); } // 这里使用动态代理模式监听setter方法调用 return (T) java.lang.reflect.Proxy.newProxyInstance( original.getClass().getClassLoader(), original.getClass().getInterfaces(), (proxy, method, args) -> { // 只拦截setter方法 if (method.getName().startsWith("set") && args.length == 1) { String propertyName = method.getName().substring(3); propertyName = propertyName.substring(0, 1).toLowerCase() + propertyName.substring(1); // 获取旧值 Object oldValue = original.getClass() .getMethod("get" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1)) .invoke(original); // 调用原始方法 Object result = method.invoke(original, args); // 触发监听器 for (PropertyChangeListener<T> listener : listeners) { listener.onPropertyChange(original, propertyName, oldValue, args[0]); } // 自动同步到后端 syncEntity(original); return result; } return method.invoke(original, args); } ); } // 以下是List接口的实现 @Override public int size() { return list.size(); } @Override public boolean isEmpty() { return list.isEmpty(); } @Override public boolean contains(Object o) { return list.contains(o); } @NonNull @Override public Iterator<T> iterator() { return list.iterator(); } @NonNull @Override public Object[] toArray() { return list.toArray(); } @NonNull @Override public <T1> T1[] toArray(@NonNull T1[] a) { return list.toArray(a); } @Override public boolean add(T t) { T proxy = createProxy(t); boolean result = list.add(proxy); if (!batchMode) { syncEntity(proxy); } return result; // 添加时创建代理 } @Override public boolean remove(Object o) { T entity = safeCast(o); if (entity != null) { syncEntity((T) entity); // 删除前同步 } return list.remove(o); } @Override public boolean containsAll(@NonNull Collection<?> c) { return list.containsAll(c); } @Override public boolean addAll(@NonNull Collection<? extends T> c) { boolean modified = false; for (T t : c) { modified |= add(t); } return modified; } @Override public boolean addAll(int index, @NonNull Collection<? extends T> c) { for (T t : c) { add(index++, t); } return true; } @Override public boolean removeAll(@NonNull Collection<?> c) { for (Object o : c) { T entity = safeCast(o); if (entity != null) { syncEntity(entity); } } return list.removeAll(c); } @Override public boolean retainAll(@NonNull Collection<?> c) { List<T> toRemove = new ArrayList<>(); for (T t : list) { if (!c.contains(t)) { toRemove.add(t); } } // 使用安全转换 for (T entity : toRemove) { syncEntity(entity); } return list.retainAll(c); } @Override public void clear() { for (T t : list) { syncEntity(t); // 清空前同步 } list.clear(); } @Override public T get(int index) { return list.get(index); } @Override public T set(int index, T element) { T old = list.set(index, createProxy(element)); if (old != null) { syncEntity(old); // 替换旧元素前同步 } return old; } @Override public void add(int index, T element) { list.add(index, createProxy(element)); } @Override public T remove(int index) { T removed = list.remove(index); if (removed != null) { syncEntity(removed); // 删除前同步 } return removed; } @Override public int indexOf(Object o) { return list.indexOf(o); } @Override public int lastIndexOf(Object o) { return list.lastIndexOf(o); } @NonNull @Override public ListIterator<T> listIterator() { return list.listIterator(); } @NonNull @Override public ListIterator<T> listIterator(int index) { return list.listIterator(index); } @NonNull @Override public List<T> subList(int fromIndex, int toIndex) { return list.subList(fromIndex, toIndex); } }package com.example.kucun2.entity.data; import android.content.Context; import android.util.Log; import com.example.kucun2.entity.*; import com.example.kucun2.function.MyAppFnction; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.IOException; import java.lang.reflect.Type; import java.util.*; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class Data { // 数据集合声明(保持原有属性名不变) public static SynchronizedList<Bancai> bancais = new SynchronizedList<>(Bancai.class); public static SynchronizedList<Caizhi> caizhis = new SynchronizedList<>(Caizhi.class); public static SynchronizedList<Mupi> mupis = new SynchronizedList<>(Mupi.class); public static SynchronizedList<Chanpin> chanpins = new SynchronizedList<>(Chanpin.class); public static SynchronizedList<Chanpin_Zujian> chanpinZujians = new SynchronizedList<>(Chanpin_Zujian.class); public static SynchronizedList<Dingdan> dingdans = new SynchronizedList<>(Dingdan.class); public static SynchronizedList<Dingdan_Chanpin> dingdanChanpins = new SynchronizedList<>(Dingdan_Chanpin.class); public static SynchronizedList<Dingdan_Bancai> dingdanBancais = new SynchronizedList<>(Dingdan_Bancai.class); public static SynchronizedList<Kucun> kucuns = new SynchronizedList<>(Kucun.class); public static SynchronizedList<Zujian> zujians = new SynchronizedList<>(Zujian.class); public static SynchronizedList<User> users = new SynchronizedList<>(User.class); public static SynchronizedList<Jinhuo> jinhuoList = new SynchronizedList<>(Jinhuo.class); private static final Gson gson = new Gson(); private static final OkHttpClient client = new OkHttpClient(); private static final String TAG = "DataLoader"; // 加载所有数据的方法 public static void loadAllData(Context context, LoadDataCallback callback) { // 开始批量模式 for (SynchronizedList<?> list : getAllSyncLists()) { list.beginBatch(); } String url = MyAppFnction.getStringResource("String", "url") + MyAppFnction.getStringResource("String", "url_all"); Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "Failed to load data", e); if (callback != null) callback.onFailure(); } @Override public void onResponse(Call call, Response response) throws IOException { parseAndAssignData(response.body().string(), context); // 结束批量模式(会触发一次全量同步) for (SynchronizedList<?> list : getAllSyncLists()) { list.endBatch(); } if (callback != null) callback.onSuccess(); } }); } // 获取所有同步列表的方法 private static List<SynchronizedList<?>> getAllSyncLists() { return Arrays.asList(bancais, caizhis, mupis, chanpins, chanpinZujians, dingdans, dingdanChanpins, dingdanBancais, kucuns, zujians, users, jinhuoList); } // 解析并赋值数据 private static void parseAndAssignData(String jsonData, Context context, LoadDataCallback callback) { // 创建包含所有数据类型的TypeToken Type informationType = new TypeToken<Information<AllDataResponse>>(){}.getType(); Information<AllDataResponse> information = gson.fromJson(jsonData, informationType); if (information == null || information.getData() == null || information.getStatus() != 200) { Log.e(TAG, "Invalid response data"); if (callback != null) callback.onFailure(); return; } AllDataResponse allData = information.getData(); // 赋值到对应的列表(使用安全方法保持已有引用) updateList(bancais, allData.bancais); updateList(caizhis, allData.caizhis); updateList(mupis, allData.mupis); updateList(chanpins, allData.chanpins); updateList(chanpinZujians, allData.chanpin_zujians); updateList(dingdans, allData.dingdans); updateList(dingdanChanpins, allData.dingdan_chanpins); updateList(dingdanBancais, allData.dingdan_bancais); updateList(kucuns, allData.kucuns); updateList(zujians, allData.zujians); updateList(users, allData.users); updateList(jinhuoList, allData.jinhuos); resolveReferences(); if (callback != null) callback.onSuccess(); } // 更新列表内容但保持对象引用不变 private static <T> void updateList(List<T> existingList, List<T> newList) { if (newList == null) return; existingList.clear(); for (T item : newList) { existingList.add(item); // 会被包装成代理对象 } } // 解析对象间的引用关系(使用ID关联) private static void resolveReferences() { // 创建ID到对象的映射 Map<Integer, Bancai> bancaiMap = createIdMap(bancais); Map<Integer, Caizhi> caizhiMap = createIdMap(caizhis); Map<Integer, Mupi> mupiMap = createIdMap(mupis); Map<Integer, Chanpin> chanpinMap = createIdMap(chanpins); Map<Integer, Zujian> zujianMap = createIdMap(zujians); Map<Integer, Dingdan> dingdanMap = createIdMap(dingdans); Map<Integer, Kucun> kucunMap = createIdMap(kucuns); // 解析Bancai引用 for (Bancai banca : bancais) { Bancai bancai = bancais.getOriginal(banca); if (bancai.getCaizhi() != null) { bancai.setCaizhi(caizhiMap.get(bancai.getCaizhi().getId())); } if (bancai.getMupi1() != null) { bancai.setMupi1(mupiMap.get(bancai.getMupi1().getId())); } if (bancai.getMupi2() != null) { bancai.setMupi2(mupiMap.get(bancai.getMupi2().getId())); } } // 解析Kucun引用 for (Kucun kucu : kucuns) { Kucun kucun = kucuns.getOriginal(kucu); if (kucun.getBancai() != null) { kucun.setBancai(bancaiMap.get(kucun.getBancai().getId())); } } // 解析订单相关的嵌套对象 for (Dingdan_Chanpin dca : dingdanChanpins) { Dingdan_Chanpin dc = dingdanChanpins.getOriginal(dca); if (dc.getDingdan() != null) { dc.setDingdan(dingdanMap.get(dc.getDingdan().getId())); } if (dc.getChanpin() != null) { dc.setChanpin(chanpinMap.get(dc.getChanpin().getId())); } } // 解析产品相关的嵌套对象 for (Chanpin_Zujian czz : chanpinZujians) { Chanpin_Zujian cz = chanpinZujians.getOriginal(czz); if (cz.getChanpin() != null) { cz.setChanpin(chanpinMap.get(cz.getChanpin().getId())); } if (cz.getZujian() != null) { cz.setZujian(zujianMap.get(cz.getZujian().getId())); } if (cz.getBancai() != null) { cz.setBancai(bancaiMap.get(cz.getBancai().getId())); } } // 解析库存关联 for (Kucun ks : kucuns) { Kucun k = kucuns.getOriginal(ks); if (k.getBancai() != null) { k.setBancai(bancaiMap.get(k.getBancai().getId())); } } } // 添加方法来获取原始对象 @SuppressWarnings("unchecked") public T getOriginal(T proxy) { if (proxy instanceof java.lang.reflect.Proxy) { java.lang.reflect.InvocationHandler handler = java.lang.reflect.Proxy.getInvocationHandler(proxy); if (handler instanceof EntityProxyHandler) { return ((EntityProxyHandler<T>) handler).getOriginal(); } } return proxy; } // 创建ID到对象的映射 private static <T extends EntityClassGrassrootsid> Map<Integer, T> createIdMap(List<T> list) { Map<Integer, T> map = new HashMap<>(); for (T item : list) { map.put(item.getId(), item); } return map; } // 回调接口 public interface LoadDataCallback { void onSuccess(); void onFailure(); } // 内部类用于解析JSON响应 public static class AllDataResponse { public List<Bancai> bancais; public List<Caizhi> caizhis; public List<Mupi> mupis; public List<Chanpin> chanpins; public List<Chanpin_Zujian> chanpin_zujians; public List<Dingdan> dingdans; public List<Dingdan_Chanpin> dingdan_chanpins; public List<Dingdan_Bancai> dingdan_bancais; public List<Kucun> kucuns; public List<Zujian> zujians; public List<User> users; public List<Jinhuo> jinhuos; } }
06-10
// 优化后的 FilterableAdapter 类 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 ItemFilter filter = new ItemFilter(); 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); } @Override public int getCount() { return filteredList.size(); } @Override public T getItem(int position) { return filteredList.get(position); } // 核心优化:统一的格式化方法 protected abstract String formatItemText(T item); @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false); } TextView textView = convertView.findViewById(android.R.id.text1); T item = getItem(position); textView.setText(item != null ? formatItemText(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_dropdown_item_1line, parent, false); } TextView textView = convertView.findViewById(android.R.id.text1); T item = getItem(position); textView.setText(item != null ? formatItemText(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; } 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 (formatItemText(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(); } } } } 选择之后显示的还是内存地址
最新发布
07-01
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、付费专栏及课程。

余额充值