在Android中 我們經常使用到ListView GridView RecyclerView,Adapter 通常是繼承自BaseAdapter/RecyclerView.Adapter
但開發中也可能需要展示的資料只有一個標題或者屬性,自定義Adapter顯得有些囊腫,但ArrayAdaprer 很多資料都是使用ArrayList 進行資料描述,但這樣可擴充套件性很差
下面教大家如何正確使用ArrayAdapter private ArrayList<? extends T> mDatas;
if (mDatas != null && !mDatas.isEmpty()) { mListView.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, mDatas)); } 如果我們這樣使用自定義的Bean類 會輸出物件的資訊
這不是我們要的
但有什麼方法呢 我們看一下原始碼
getView方法: @Override public @NonNull View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { return createViewFromResource(mInflater, position, convertView, parent, mResource); } 這是具體的實現 首先查詢這個TextView 進行快取 private @NonNull View createViewFromResource(@NonNull LayoutInflater inflater, int position, @Nullable View convertView, @NonNull ViewGroup parent, int resource) { final View view; final TextView text;
if (convertView == null) {
view = inflater.inflate(resource, parent, false);
} else {
view = convertView;
}
try {
if (mFieldId == 0) {
// If no custom field is assigned, assume the whole resource is a TextView
text = (TextView) view;
} else {
// Otherwise, find the TextView field within the layout
text = view.findViewById(mFieldId);
if (text == null) {
throw new RuntimeException("Failed to find view with ID "
+ mContext.getResources().getResourceName(mFieldId)
+ " in item layout");
}
}
} catch (ClassCastException e) {
Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
throw new IllegalStateException(
"ArrayAdapter requires the resource ID to be a TextView", e);
}
final T item = getItem(position);
複製程式碼
如果傳遞過來的物件是CharSequence or String 型別 就直接設定文字 if (item instanceof CharSequence) { text.setText((CharSequence) item); } else { 否則就設定物件的toString方法 text.setText(item.toString()); }
return view;
複製程式碼
} 看到這 是否恍然大悟了呢 如果傳遞過來的物件就是該物件的toString
但我們一般Bean類都不會複寫toStirng方法 而是呼叫Object 預設是物件的hash值
但我們可以複寫toString()方法來正確使用
也就是實體類中 重寫toString()方法 返回我們想要的欄位 比如 name , type
這個toString()返回的就是我們想要在ArrayAdapter裡面顯示的內容 返回想要顯示資訊的欄位即可