1. 程式人生 > >listView巢狀listView的實現,以及遇到的問題的解決

listView巢狀listView的實現,以及遇到的問題的解決

先看看listView巢狀listView效果圖:


頁面效果是ListVierw巢狀listView,外層listView(以下簡稱外層LV)展示的是專案,內層listView是每個專案下面對應的需求listView;效果有點類似QQ空間裡的動態和其下面對應的評論。
廢話不多說,看怎麼實現的:
首先此fragment對應的佈局檔案就是一個ListView;而在listView的item的佈局裡,上面部分是專案標題和圖片圖片控制元件,下面又是一個自定義的ListView--解決內層LV的高度的問題(待會兒文章最後程式碼附上,以下簡稱內層LV),因為內層的LV的資料和外層的LV的資料時整體的,即內層資料是外層資料的一個jsonArray,因此,內層LV的初始化及其一系列的設定介面卡和設定監聽都應在外層的LV的介面卡中的getView方法中實現:







外層的LV 的介面卡:
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder mHolder;
//1.例項化ViewHolder
。。。。。。。。
// 2.佈局填充器泵填充佈局(本質上省略了xmlPullParse解析的過程)
。。。。。。。。
// 3.findViewById的過程
。。。。。。。。。
// 獲取傳進來的資料進行顯示
// 給</span>外層item上的控制元件進行賦值

。。。。。。。
//注意:此處初始化內層ListView
initItemListView(convertView);

return convertView;
}
private void initItemListView(final View convertView) {
ListView definedListview = (ListView) convertView
.findViewById(R.id.expandedListview_industrychainItem);
definedListview.setAdapter(new BaseAdapter() {</span>
@Override
       public long getItemId(int position) {
      // TODO Auto-generated method stub

      return position;
}




@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return industryChain.getIndustrychainItemDemandList().get(
position);
}


@Override
public int getCount() {
....}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolderItem mHolderItem;
//為內層LV的item的控制元件賦值</span>
}


OK,效果完美實現。(如果不用給內層LV的item設定點選監聽的話,到此為止)


但是,
如果給內層LV的item設定點選監聽的話,有個問題來了,給內層的LV 的item設定監聽時,偶爾會報錯,我說的是“偶爾”;報錯如下:
java.lang.IllegalStateException: 
The content of the adapter has changed but ListView did not receive a notification. 
Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. 
Make sure your adapter calls notifyDataSetChanged() when its content changes.

意思大體是,你的adapter的內容變化了,但是你的ListView並不知情。請保證你adapter的資料在主執行緒中進行更改!
怎麼解決呢?內層listView的初始化,肯定是要在外層的LV 的adapter的getView中進行的,
但是要解決此問題,我們可以把獲取的內層的LV 的item的資料傳會給主執行緒,在主執行緒中為其賦值,問題就解決了。
方法:
如上面最開始的程式碼:
在外層LV 的adapter的getView方法中,替換掉呼叫的藍色字型的方法,換用fragment碎片中新增定義的靜態方法,同時將需要的資料傳過來:
// 靜態方法-初始化內層listView
// 之前是在外層listView的adapter中初始並賦值內層item的,但偶爾會報錯:

/**
* java.lang.IllegalStateException: The content of the adapter has changed
* but ListView did not receive a notification. Make sure the content of
* your adapter is not modified from a background thread, but only from the
* UI thread. Make sure your adapter calls notifyDataSetChanged() when its
* content changes. [in ListView(2131034339, class
* com.bjcric.intelcce.definition.ExpandedListView) with Adapter(class
* com.bjcric.intelcce.adapter.IndustryChainListViewAdapter$2)]
*/

// 為了解決以上異常,辦法:在主執行緒中進行賦值。
// 在外層listView的adapter中,將獲取到的資料傳到本主執行緒中

private static IndustryChainListViewItemAdapter adapter2;




void initItemListView(final Context context,
View convertView, IndustryChain industryChain) {
ListView definedListview = (ListView) convertView
.findViewById(R.id.expandedListview_industrychainItem);
adapter2 = new IndustryChainListViewItemAdapter(context, industryChain,
convertView);
definedListview.setAdapter(adapter2);




// 內層listView的item點選監聽
definedListview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent demandDetail = new Intent(context,
Industrychain_projectDemandDetailActivity.class);
context.startActivity(demandDetail);
}
});




}


好了,偶爾丟擲的異常也已解決,listView巢狀listView的實現,和異常的解決,講述完畢。

下面附上自定義的ListView的程式碼:

public class DefinedListView extends ListView {


public DefinedListView(Context context) {
super(context);
setBackgroundColor(Color.argb(100, 0, 55, 55));
}




public DefinedListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}




public DefinedListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}




@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);




super.onMeasure(widthMeasureSpec, expandSpec);
}
}

相關推薦

listViewlistView實現以及遇到的問題的解決

先看看listView巢狀listView效果圖: 頁面效果是ListVierw巢狀listView,外層listView(以下簡稱外層LV)展示的是專案,內層listView是每個專案下面對應的需求listView;效果有點類似QQ空間裡的動態和其下面對應的評論。廢話不

ListView在ScrollView無法置頂【啟動位置偏移的解決方案】

myScrollView.smoothScrollTo(0,20); 在程式碼裡去掉listview的焦點,lv.setFocusable(false); 以上是關鍵程式碼。     全域性程式碼如下: package com.findai.xkk.ai_

ScrollView+Fragment+ListViewListView麻麻再也不用擔心我不會寫

前言 之前寫了一篇文章 android ListView/GridView與ScrollView巢狀的滑動衝突解決 介紹瞭如何解決ScrollView與AdapterView的巢狀,但是沒有給出demo,那是因為那些程式碼比較多,而且是在手頭的專案裡,業

Android ListViewListView實現方式

首先剛到北京一個月,產品經理讓做一個類似於商城的東東,起初感覺沒什麼難度,(不就一個電子商務app嘛,以前也做過啊),但是當看到有需求是這樣的 然後就開始做,起初太懶了,就在網上找,找到了一個ListView巢狀ListView的一哥們的講解的大致思路的,然後根據那

UWP LISTVIEWLISTVIEW

文章來自:原始碼線上https://shengli.me/wxxcx/199.html 程式碼:   >>小程式下拉框的實現   <<沒有了 相關內容  UWP LISTVIEW巢狀

android ListView ListView

實現的效果是這個樣子的 看上去效果還是不錯,不過現在有個重新整理問題一直沒能解決,重新整理的時候裡面的adapter進行重新整理的時候總是會讓裡面的listview消失掉,應該是父listview先重新整理完後,子listview還未重新整理完成,導致測量的高度不對,就會

ListViewListView,TextView有多行文字顯示不全不問題

這是在網上找到的相關的解決方法,記錄下來,方便以後檢視。 關於ListView巢狀ListView,在網上找到的解決方法是呼叫自定義的方法動態計算listview的高度: public void setListViewHeightBasedOnChildren(ListVi

android listviewListview不能顯示全部內容

需要在setapdater後呼叫這個方法,必須保證子Listview的每個項textview外面都有linerlayout  public static void setListViewHeightBasedOnChildren(ListView listView) {  

listviewlistview的替換解決方案(適用於個別情況)

按照android的listview機制,理論上不推薦listview'巢狀。這不,我就遇到了listview巢狀listview 的諸多問題。 問題:listview 資料顯示不完全(只顯示一行) listview的機制就是item的佈局或者內容相似或者相同(具體原理這裡

listviewgridview實現grid元素部分顯示以及點選展開與摺疊

有時我們需要用GridView顯示目錄列表,有時甚至是二級的,即listview每一個item裡面又各自嵌入一個gridview,但是當二級目錄(資料條目)的數量過多時,介面會比較臃腫,這時我們就想要有類似展開與摺疊的效果,作者採用的策略是資料分段的分別顯示,其中對於顯示邊

ScrollViewListView,GridView,ViewPager以及這些控制元件自動滾動到底部問題的解決

Google是不推薦在ScrollView 中放入一個可滾動的選單的,比如放置一個ListView、GridView、ViewPager這些控制元件的,儘量不要讓兩者巢狀,但有時候還是有這個需求,先不管它合不合理。如果直接在ScrollView中巢狀只會出現一行,然後在其中滾動,這樣不是很好,下面是我的整理

上拉載入包裹任意佈局多層listview

  上拉載入是在原生控制元件swipeRefreshlayout的基礎上增加的功能,實現方式網上copy就行。主要是refreshLayout包裹多層佈局,多個listview的時候,操作的是那個listview。程式碼可以看出所有上拉載入的操作均在佈局繪製完成,且資料載入完畢以後,能夠對

NestedScrollViewListView出現問題以及解決方法

在使用CoordinatorLayout和AppBarLayout實現巢狀滑動的時候,出現listview沒有巢狀滑動; 如果要實現巢狀滑動,則需要新增NestedScrollView,但是結果發現listview只顯示一行資料 <android.support.v4.widget.N

ScrollViewListView、RecyclerView使其高度自適應

1、針對ScrollView巢狀ListView時只顯示第一個item高度的bug,可在activity裡動態修改ListView的高度(即計算每個item和分割線的高度後進行相加得到總高度),在setAdapter之後呼叫下面這個函式即可。 值得注意的是,此時ListVi

ScrollViewListView顯示不全和位置不是頂部的解決辦法

(1)首先寫一個listview的頁面,用ScrollView進行巢狀,注意ScrollView裡面只能有一個佈局屬性,多個可以用Linearout進行包含 <?xml version="1.0" encoding="utf-8"?> <RelativeL

android開發實現微博正文效果、頂部懸浮、ScrollViewListView

先來看一下效果圖 從圖中不難看出,我這裡使用了ScrollView巢狀ListView的方式來實現的這種效果。 這裡我們需要重寫一下ScrollView,程式碼如下: package com.gsssk.ddpolice.myview; impo

ScrollViewListViewlistItem.measure(0,0);報空指標異常NullPointerException

1: SrollView巢狀ListView時顯示不全問題及ListView高度問題: 直接上程式碼,使用以下函式解決此問題: public void setListViewHeightOnChildren(ListView listView) {

Android 混排效果之 ScrollView RecyclerView gridview 實現listview gridview 效果

RecyclerView 出現以後 很受大家歡迎 漂亮流暢的列表 簡單的操作 可以幫我們完成很多的列表 但是有一種listview 巢狀gridview 的效果 目前還是需要巢狀才能完成 現在就簡單說一下我的思路 本人的需求是例如手機淘寶頁 本人使用老套的實現模

由滑動頂端懸浮引發的效能優化大坑坑坑—ScrollViewListView以及層層

看題目就知道,今天我們主要講的主角是關於scrollview巢狀listview以及再層層巢狀導致的效能優化問題。現在市面上好多app都有這樣一種功能,在頁面中間某一位置有一個佈局,在頁面整體向上滑動時,當此佈局到達螢幕頂端或者某一位置時要求此佈局懸浮停靠,

Android scrollview中listview實現listview的下拉重新整理上拉載入更多

我們都知道在Android中scrollview和listview都能滑動,如果scrollview巢狀listview會出現一些問題,比如listview不能正常顯示item...但是在一些專案中,一些頁面內容比較多,需要在外面放一個scrollview,裡面還會巢狀li