1. 程式人生 > >Android 使用ArrayAdapter 載入Bean資料

Android 使用ArrayAdapter 載入Bean資料

在Android中 我們經常使用到ListView GridView  RecyclerView,Adapter 通常是繼承自BaseAdapter/RecyclerView.Adapter<VH>

但開發中也可能需要展示的資料只有一個標題或者屬性,自定義Adapter顯得有些囊腫,但ArrayAdaprer 很多資料都是使用ArrayList<String> 進行資料描述,但這樣可擴充套件性很差

 

下面教大家如何正確使用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()就是我們想要在ArrayAdapter裡面顯示的內容 返回想要顯示資訊的欄位即可

 

QQ  643200732