listview嵌套listview,子listview中有換行的textview展示有問題,腫么辦?

??這些天遇到一個問題,就是我有個界面因為業務的需要,就必須做成listview嵌套listview,然后被嵌套的listview的Item里面有textview,剛開始也沒什么,后來突然有條數據的字符串特別長,然后子listview的Item的textview就換行了,然后,然后你們懂得,子listview就顯示異常了呀,內容就不能完全展示了。
??其實google也是不推薦可以滾動的控件里面再次嵌套可以滾動的控件的。可是,無奈產品的需求呀。不過,已經有大神解決了這種嵌套問題,一般是有兩種解決方法,一是重寫listview的onMeasure方法,另外一種是設置完listview的adapter,動態測量listview的高度,當然這種情況是要求listview的子條目最外層布局是linearlayout線性布局了。其實說這個也是為這個textview換行問題做鋪墊了。我嵌套listview時候用的是 第一種方法就是自定義了listview。但是依然出現了這個問題,好的,那咱們換換第二種方式呢?結果依然悲劇,依然是有問題。然后就去看看網上大牛都是怎么解決的。其實,看了下最主要的就是有兩種解決方式,一種是用重寫onMeasure的listview的方式,但是我試了不好使。另外一種就是重寫textview的onMeasure,就是去除padding以及drawablePadding后,算出每行的寬度,然后用measureText方法測試賦值給textview的字符串在屏幕上占據的總長度,然后兩者相除得到行數,然后在用textview每行的高度*行數得到textview應有的寬高,看起來也的確是合情合理呀。可是我試了還是不好使的。哎,日子可該怎么過呀。
??既然試了都不好用。然后我就想用listview肯定是不行了。看來列表類的都不好用了。然后,然后我就用了linearlayout了。這也是萬般無奈的做法,實屬下下策。但是也的確是可以解決問題。算是一種臨時性的解決方案吧。大家都知道線性布局,當它的orientation設置為vertical,然后它的子布局都一樣,看起來會怎樣?是不是也可以看做一個列表,雖然它不是。
??接下來看具體實施,因為我之前用的就是listview嵌套listview,所以如上面所說我將子listview換成了一個orientation為vertical的linearlayout了。原來的listview的adapter其實是可以復用的。它就是用來構造添加進linearlayout里面的子view的。看如下代碼:

private void addView(){
        /**
         * 下面的ExampleBean是實體Bean,同樣listTemp是給adapter的list集合了(我寫的假數據)
         */
        List<ExampleBean> listTemp = new ArrayList<>();
        ExampleAdapter exampleAdapter = new ExampleAdapter(listTemp,context);
        //通過循環向linearlayout里面添加子view,相當于listview的Item了
        for(int i=0;i<exampleAdapter.getCount();i++){
            //通過adapter的getview方法獲取子view
            View view = exampleAdapter.getView(i, null, null);
            //給子view設置margin屬性(當然也可以有別的屬性了)
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
            layoutParams.setMargins(0, DevUtils.dp2px(10),0,0);
            view.setLayoutParams(layoutParams);
            //給linearlayout的Item設置點擊事件,模擬listview的onItemClickListener
            view.setOnClickListener(new MyOnClickListener(exampleAdapter.get(i),i));
            linearlayout.addView(view);
        }
    }```

/**
* 要給linearlayout添加的點擊事件監聽
*/
private class MyOnClickListener implements View.OnClickListener{
private ExampleBean exampleBean;
private int currentPosition;
//通過構造方法將需要的參數傳遞進來(可根據自己業務需要擴展)
public MyOnClickListener(ExampleBean exampleBean,int position){
this.exampleBean = exampleBean;
this.position = position;
}

    @Override
    public void onClick(View v) {
        //在這里寫自己的業務跳轉邏輯就好了
    }
}```

??是的,核心的代碼就是如上的兩個方法了。下面的MyOnClickListener就是給線性布局的每個Item添加的點擊事件。這個也是我目前最可能遇到的業務場景了,就是Item的點擊事件。如果是Item內部的事件,我們不需要做額外的處理了,交給adapter就好了。
??以上就是這次遇到問題的解決過程。當然這個只是一個臨時性的解決方法,因為listview這個列表控件的Item的復用性肯定比linearlayout好很多。如果大家有什么好的點子,歡迎分享,多多指教。如果不對之處,歡迎指出。周末愉快。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容