simple_dropdown_item_1line的问题

今天在Android Developers查看AutoCompleteTextView 时发现示例代码
[java]  view plain copy print ?
  1. public class CountriesActivity extends Activity {  
  2.     protected void onCreate(Bundle icicle) {  
  3.         super.onCreate(icicle);  
  4.         setContentView(R.layout.countries);  
  5.   
  6.         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  
  7.                 android.R.layout.simple_dropdown_item_1line, COUNTRIES);  
  8.         AutoCompleteTextView textView = (AutoCompleteTextView)  
  9.                 findViewById(R.id.countries_list);  
  10.         textView.setAdapter(adapter);  
  11.     }  
  12.   
  13.     private static final String[] COUNTRIES = new String[] {  
  14.         "Belgium""France""Italy""Germany""Spain"  
  15.     };  
  16. }  


中有android.R.layout.simple_dropdown_item_1line,一直只是从名字来判断它是简单的一行下拉项目,而没有好好的去弄清楚这到底是什么。今天决定好好看看这个文件到底是

什么意思。首先从android.R.layout可以看出它是一个layout资源,故直接进入E:\Java\android-sdk-windows\platforms\android-8\data\res\layout(我的android-sdk-windows是安装在java下的;我选的开发版本是android2.2,其API Version是8,故选android-8目录),找到simple_dropdown_item_1line.xml:

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TextView xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:id="@android:id/text1"   
  4.     style="?android:attr/dropDownItemStyle"   
  5.     android:textAppearance="?android:attr/textAppearanceLargeInverse"   
  6.     android:singleLine="true"   
  7.     android:layout_width="match_parent"   
  8.     android:layout_height="?android:attr/listPreferredItemHeight"   
  9.     android:ellipsize="marquee"  
  10.     />   

再进入E:\Java\android-sdk-windows\platforms\android-8\data\res\values找到attr.xml文件可以找到

  1. <!--  Default style for drop down items. -->   
  2.   <attr name="dropDownItemStyle" format="reference" />   
  3. <!--  Text color, typeface, size, and style for "large" inverse text.   
  4. Defaults to primary inverse text color. -->   
  5.   <attr name="textAppearanceLargeInverse" format="reference" />   

可以看出此TextView的样式是dropDownItemStyle即默认的下拉条目样式;文本外观是textAppearanceLargeInverse即大反差文本。

ellipsize属性即当文本不能完全显示时,文本的显示方式。有五种样式可选。

Constant Value Description
none 0 无样式
start 1 前面文本不显示
middle 2 中间的文本不显示
end 3 末尾的文本不显示
marquee 4 跑马灯风格
 
为了方便观察将示例中的字符串改为: String[] strs={"abcdefg","abcdefghi","abcghijkl","abcdfghjklzxcvbnmqwertyuiopasdfghjklzx"};
测试效果如下:
private FilterableAdapter dingdanAdapter; private FilterableAdapter chanpinAdapter; private FilterableAdapter zujianAdapter; private FilterableAdapter bancaiAdapter; 已将有了Adapter适配器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.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.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); // 默认选中"请选择" } }
07-01
// 优化后的 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值