編輯:關於Android編程
我們知道,有些時候我們需要在ListView外層嵌套一層ScrollView,代碼如下:
只要稍微有點經驗的人都知道這是會出現什麼問題,沒錯,就是“Listview不能顯示正常的條目,只顯示一條或二條”,這是怎麼回事呢?這是因為:由於listView在scrollView中無法正確計算它的大小, 故只顯示一行。
當目前為止,我知道的針對這一問題的解決辦法有:
activity_list_view_scroll_view_test.xml:
WrapperListView.java:
public class WrapperListView extends ListView {
public WrapperListView(Context context) {
super(context);
}
public WrapperListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WrapperListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public WrapperListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
/**
* 重寫該方法,達到使ListView適應ScrollView的效果
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
ListViewScrollViewTestActivity.java:
public class ListViewScrollViewTestActivity extends AppCompatActivity {
private ScrollView scrollView;
private WrapperListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_scroll_view_test);
scrollView = (ScrollView) findViewById(R.id.scrollView);
listView = (WrapperListView) findViewById(R.id.listview);
initListVeiw();
}
private void initListVeiw() {
List list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add("第 " + i + " 條");
}
listView.setAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_1, list));
}
}
另外,哪位大神可以告訴我在代碼塊(```)中,怎麼給某一行加粗,或者做一些其他明顯標記??????????????
只需要在setAdapter之後調用如下方法即可:
public void setListViewHeightBasedOnChildren(ListView listView) {
// 獲取ListView對應的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回數據項的數目
View listItem = listAdapter.getView(i, null, listView);
// 計算子項View 的寬高
listItem.measure(0, 0);
// 統計所有子項的總高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()獲取子項間分隔符占用的高度
// params.height最後得到整個ListView完整顯示需要的高度
listView.setLayoutParams(params);
}
另外,這時,這時最好給ListView之外嵌套一層LinearLayout,不然有時候這種方法會失效,如下:
可以確定的是:這種方式可以改變ListView的高度,但是,還有一個嚴重的問題就是listview的數據是可變動的,除非你能正確的寫出listview的高度,否則這種方式就是個雞肋。
如下:
某些情況下,其實我們可以完全避免ScrollView嵌套Listview,比如使用listview的addHeader() 函數來實現預期效果或者利用布局的特性達到預期效果,當然,具體怎麼用,只有在開發中慢慢琢磨,慢慢總結了.
至此,關於“ListView怎麼和ScrollView兼容”這個問題就算是回答完了,如果有不明白的地方可以問我,同樣,那裡有錯誤也歡迎大家指出,真的不勝感激。
接下來要說的就是!!!!!
關於Listview的優化,只要面試過的人,我相信都對這個題很熟悉,不管有沒有人問過你這個題,我想你自己也一定准備過,否則,嘿嘿!!!!!而且網上也一搜一大把這裡就簡單提幾個主要的:
1)、convertView復用,對convetView進行判空,當convertView不為空時重復使用,為空則初始化,從而減少了很多不必要的View的創建
2)定義一個ViewHolder,封裝Listview Item條目中所有的組件,將convetView的tag設置為ViewHolder,不為空時通過ViewHolder的屬性獲取對應組件即可
3)、當ListView加載數據量較大時可以采用分頁加載和圖片異步加載(關於Listview分頁加載和圖片異步加載思路請看接下來的文章內容)
解決辦法有兩種:
方法一:把套在裡面的ListVew 不讓獲取焦點即可。listview.setFocusable(false);注意:在xml布局裡面設置android:focusable=“false”不生效
方法二:myScrollView.smoothScrollTo(0,0);
實現OnScrollListener 接口重寫onScrollStateChanged 和onScroll方法,
使用onscroll方法實現”滑動“後處理檢查是否還有新的記錄,如果有,調用 addFooterView,添加記錄到adapter, adapter調notifyDataSetChanged 更新數據;如果沒有記錄了,把自定義的mFooterView去掉。使用onScrollStateChanged可以檢測是否滾到最後一行且停止滾動然後執行加載
在listview子布局裡面寫,可以解決焦點失去的問題
android:descendantFocusability=”blocksDescendants”
1.先從內存緩存中獲取圖片顯示(內存緩沖)
2.獲取不到的話從SD卡裡獲取(SD卡緩沖,,從SD卡獲取圖片是放在子線程裡執行的,否則快速滑屏的話會不夠流暢)
3.都獲取不到的話從網絡下載圖片並保存到SD卡同時加入內存並顯示(視情況看是否要顯示)
原因是button強制獲取了item的焦點,只要設置button的focusable為false即可。
繼承自BaseAdapter實現裡面的方法,listView在開始繪制的時候,系統首先調用getCount()函數,根據他的返回值得到listView的長度,然後根據這個長度,調用getView()逐一繪制每一行。如果你的getCount()返回值是0的話,列表將不顯示同樣return 1,就只顯示一行。系統顯示列表時,首先實例化一個適配器(這裡將實例化自定義的適配器)。當手動完成適配時,必 須手動映射數據,這需要重寫getView()方法。系統在繪制列表的每一行的時候將調用此方法。getView()有三個參數,position表示將顯示的是第幾行,covertView是從布局文件中inflate來的 布局。我們用LayoutInflater的方法將定義好的main.xml文件提取成View實例用來顯示。
然後 將xml文件中的各個組件實例化(簡單的findViewById()方法)。這樣便可以將數據對應到各個組件上了。但是按鈕為了響應點擊事件,需要為它添加點擊監聽器,這樣就能捕獲點擊事件。至此一個自定 義的listView就完成了,現在讓我們回過頭從新審視這個過程。系統要繪制ListView了,
他首先獲得 要繪制的這個列表的長度,然後開始繪制第一行,怎麼繪制呢?
調用getView()函數。在這個函數裡面 首先獲得一個View(實際上是一個ViewGroup),然後再實例並設置各個組件,顯示之。好了,繪制完這一行了。那 再繪制下一行,直到繪完為止。在實際的運行過程中會發現listView的每一行沒有焦點了,這是因為Button搶奪了listView的焦點,只要布局文件中將Button設置為沒有焦點就OK了。
通常實現分頁加載有兩種方式,一種是在ListView底部設置一個按鈕,用戶點擊即加載。另一種是當用戶滑動到底部時自動加載。
在ListView底部設置一個按鈕,用戶點擊即加載實現思路:
// 加上底部View,注意要放在setAdapter方法前
ListView.addFooterView(moreView);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
pg.setVisibility(View.VISIBLE);// 將進度條可見
bt.setVisibility(View.GONE);// 按鈕不可見
handler.postDelayed(new Runnable() {
@Override
public void run() {
loadMoreDate();// 加載更多數據
bt.setVisibility(View.VISIBLE);
pg.setVisibility(View.GONE);
mSimpleAdapter.notifyDataSetChanged();// 通知listView刷新數據
}
}, 2000);
}
});
當用戶滑動到底部時自動加載實現思路:
實現OnScrollListener 接口重寫onScrollStateChanged 和onScroll方法,使用onscroll方法實現”滑動“後處理檢查是否還有新的記錄,如果有,添加記錄到adapter, adapter調用 notifyDataSetChanged 更新數據;如果沒有記錄了,則不再加載數據。使用onScrollStateChanged可以檢測是否滾到最後一行且停止滾動然後執行加載.
這不是Android的優化,而是Java提倡的優化,
如果聲明成員類不要求訪問外圍實例,就要始終把static修飾符放在它的聲明中,使它成為靜態成員類,而不是非靜態成員類。
因為非靜態成員類的實例會包含一個額外的指向外圍對象的引用,保存這份引用要消耗時間和空間,並且導致外圍類實例符合垃圾回收時仍然被保留。如果沒有外圍實例的情況下,也需要分配實例,就不能使用非靜態成員類,因為非靜態成員類的實例必須要有一個外圍實例。
效果圖如下所示:先給大家說下實現android 跳轉到通訊錄的實現思路:1.點擊跳轉到通訊錄界面2.獲取通訊錄姓名和手機號碼3.回調顯示姓名和手機號碼1首先是跳轉到通訊錄
Google在Android 5.X 中增加了對SVG 矢量圖形的支持,這對於創建新的高效率動畫具有非常重大的意義。那首先了解SVG的含義。可伸縮矢量圖形(Scalabl
介紹圓角控件常用於頭像,按鈕,圖標等,用途十分廣泛,而且常常配合board使用。在IOS中,UIVIew的CALayer層已經提供了圓角和board的方法,所以圓角控件的
1、事務2、命令行操作數據庫