3

我有一個片段。這個片段在他的onCreateView方法中加載的視圖有一個ListView(A)(填充在適配器(A)中)。但是,此ListView(A)中有另一個ListView(B)。所以現在,我必須調用適配器(B)來填充此列表視圖(B)。如果我從片段調用它,我得到一個空指針,如果我從適配器(A)調用它,它不會崩潰,但它不起作用。使用適配器在列表視圖內填充ListView

如何在另一個內部調用適配器。

這是片段的代碼:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mContentView = inflater.inflate(R.layout.fragment_kidscontacts, container, false); 
    mAdapter = new KidsContactsAdapter(getActivity()); 
    final ListView list = (ListView) mContentView.findViewById(R.id.listViewKidsContacts); 
    list.setAdapter(mAdapter); 
    return mContentView; 
} 

其中mAdapter是我提出的適配器(A)的呼叫。而mContentView是一個簡單的視圖。 現在,適配器(A)的代碼中,我有一個Holder對象創建了一個名爲holder(它包含了xml中的元素)。

public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; //this is the holder object I created 

    if (convertView == null) { //View received from parameter. 
     convertView = LayoutInflater.from(mContext).inflate(R.layout.kids_contacts_list_item, parent, false); 
     holder = new ViewHolder(); 
     holder.listViewKidsContacts = (ListView) convertView.findViewById(R.id.insidelistViewKidsContacts); //ListView(B) 
     holder.kidImage = (ImageView) convertView.findViewById(R.id.kid_image); 
     holder.statusImageView = (ImageView) convertView.findViewById(R.id.status_image_view); 
     holder.nameTxtView = (TextView) convertView.findViewById(R.id.kid_friend_txtview); 
     holder.statusTextView = (TextView) convertView.findViewById(R.id.kid_status_txtview); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    //Some work I do with the holder items assigning them 

    //Trying to fill the ListView(B) 
     KidsInsideContactsAdapter mAdapter = new KidsInsideContactsAdapter(((Activity)mContext)); //This is the adapter(B) 
     holder.listViewKidsContacts.setAdapter(mAdapter); //Assign the adapter(B) to the ListView(B) 

    return convertView; 
} 

我在適配器(B)內有一些日誌,但它們沒有顯示在LogCat中。列表視圖也不填充。它顯示好像沒有列表視圖。然而在xml中它是。

回答

4

一兩件事,可能發生的是第二列表視圖的高度由於它位於另一個列表視圖內,因此沒有正確設置。我可能不得不處理一次。

嘗試使用您的第一個適配器,這個方法來設置列表視圖的高度 - (當您已設置適配器) 喜歡的東西setListViewHeightBasedOnChildren(holder.listViewKidsContacts);

//方法設置的ListView的高度動態

public static void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) 
     return; 

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED); 
    int totalHeight = 0; 
    View view = null; 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     view = listAdapter.getView(i, view, listView); 
     if (i == 0) 
      view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT)); 
     view.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
     totalHeight += view.getMeasuredHeight(); 
    } 
    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 
} 

如果不行,我會嘗試設置斷點上線: KidsInsideContactsAdapter mAdapter =新KidsInsideContactsAdapter(((活動)mContext)) ; //這是適配器(B) holder.listViewKidsContacts。setAdapter(mAdapter); //將適配器(B)分配給ListView(B)

調試時檢查mAdapter是否爲空。同時在KidsInsideContactsAdapter的構造函數中添加斷點,以查看是否一切正常。

另外檢查以確保holder.listViewKidsContacts是您在調試期間查找的列表視圖。

+0

這解決了它。 getCount返回0,因爲我有一個錯誤,所以如果有人有類似的問題,檢查出來。 –

+0

感謝隊友爲您的答案...我在適配器內調用適配器和listviews高度屬性被動態地改變了...初始是0 ...我注意到,當我改變目標更高,我看到listview項目不是visibled ..我看到你的答案後,我已經找到了問題......但是,爲什麼目標低api項目可見,但沒有更高的目標api? – Beyaz

+0

真棒!!!!!!!! –

1

你說得對。要填充第二個列表視圖中,在第一個列表視圖的適配器在

@覆蓋 公共查看getView(最終詮釋的立場,觀點convertView,一個ViewGroup父){

方法(如您在得到每件商品的第一個列表視圖),您必須從視圖中獲取(第二個)列表視圖(convertView或爲第一個列表視圖的項目擴充佈局)。一旦你抓住你要填充的(第二個)列表視圖,在這個方法中,你將設置適配器來做這樣的事情: ListView listView =(ListView)view.findViewById(R.id .___); //獲取第一個列表視圖中的第二個列表視圖 listView.setAdapter(您的第二個列表視圖的適配器)

這應該起作用。把你的代碼放在這裏,我可以看看它,並告訴你爲什麼它可能不工作。

還檢查了這些:(如果你試圖做這樣的事情)

https://github.com/emilsjolander/StickyListHeaders

或者 How to make sticky section headers (like iOS) in Android?

+0

我編輯帖子以添加一些代碼。 –