前言
那些年使用過(guò)的布局,遇到的坑以及如何解決
前兩篇:
NestedScrollView、RecycleView、ViewPager 等布局方面的常見問(wèn)題匯總,及解決
有關(guān)布局問(wèn)題:TextView、EditText……(二)
在前兩篇中已經(jīng)記錄了一些常用布局可能出現(xiàn)的問(wèn)題,以及解決方式,這里會(huì)繼續(xù)記錄此類問(wèn)題,以便以后查有出處。
問(wèn)題一:
使用RecycleView更新完數(shù)據(jù)(調(diào)用完notifyDataSetChanged();)然后滑動(dòng)到最后的一個(gè)條目(調(diào)用mRecycleView.smoothScrollToPosition(mRVAdapter.getItemCount() - 1);)出現(xiàn)RecycleView不顯示的問(wèn)題
解決方法:
出現(xiàn)這種情況的原因是,首先RecycleView為空,然后獲取數(shù)據(jù)后進(jìn)行更新,更新完立馬調(diào)用滑動(dòng)方法,導(dǎo)致整個(gè)RecycleView不顯示。猜測(cè):可能是RecycleView設(shè)置完數(shù)據(jù)還沒(méi)有刷新完成,還沒(méi)有繪制到屏幕上,就進(jìn)行了滑動(dòng)操作,結(jié)果導(dǎo)致不顯示,延時(shí)滑動(dòng)可以解決這個(gè)問(wèn)題。
// 延時(shí)滑動(dòng)
mRecycleView.postDelayed(new Runnable() {
@Override
public void run() {
if (mRVAdapter.getItemCount() > 2) {
mRecycleView.smoothScrollToPosition(mAdapter.getItemCount() - 1);
}
}
}, 300);
但是如果僅僅判斷item的條數(shù)大于2再滑動(dòng),也可以解決。
使用滑動(dòng)到底部的方式是使用的mAdapter.getItemCount() - 1,獲取最后一條的position,然后滑動(dòng),這個(gè)地方會(huì)出現(xiàn)一個(gè)bug,就是沒(méi)有數(shù)據(jù)的情況下,獲取到的數(shù)據(jù)為0,而0-1 = -1,就是拋出異常,因此在使用時(shí)盡量判斷一下。
RatingBar問(wèn)題
RatingBar是系統(tǒng)高度定制的,因此很難進(jìn)行擴(kuò)展和修改,這里講解幾個(gè)關(guān)于RatingBar的問(wèn)題
問(wèn)題二:
替換系統(tǒng)圖片
我們需要寫一個(gè)自己的style來(lái)覆蓋掉系統(tǒng)自帶的style
在styles文件里添加自己的style
<style name="mRatingBar" parent="@android:style/Widget.RatingBar">
<item name="android:progressDrawable">@drawable/rating_star</item>
<item name="android:minHeight">16dp</item>
<item name="android:minWidth">16dp</item>
</style>
這里的@drawable/rating_star是關(guān)鍵,在drawable文件夾下創(chuàng)建rating_star.xml文件,完整的實(shí)現(xiàn)如下
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@android:id/background"
android:drawable="@mipmap/your_empty_image">
</item>
<item android:id="@android:id/secondaryProgress"
android:drawable="@mipmap/your_half_image">
</item>
<item
android:id="@android:id/progress"
android:drawable="@mipmap/your_filing_image">
</item>
</layer-list>
然后在自己的RatingBar的布局下添加:
style="@style/mRatingBar"
這樣就可以替換系統(tǒng)圖片了。
問(wèn)題三:
RatingBar出現(xiàn)拉長(zhǎng)的小腳或者截?cái)嗟那闆r
解決方法:
在style中添加:
<item name="android:minHeight">16dp</item>
<item name="android:minWidth">16dp</item>
其寬和高的最小值要根據(jù)自己圖片的大小進(jìn)行設(shè)置,避免太大,或者太小。
同時(shí)在RatingBar的布局文件中設(shè)置:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
問(wèn)題四:
星星間距問(wèn)題
解決方法:
間距問(wèn)題這個(gè)要麻煩UI了,切圖片的時(shí)候就將間距加上,不然間距就是系統(tǒng)的默認(rèn)間距,或者產(chǎn)品不介意。
問(wèn)題五:
在開發(fā)中有一個(gè)需求,就是在listView的header View中添加一個(gè)橫向滑動(dòng)的RecycleView,這個(gè)功能在部分手機(jī)上出現(xiàn)問(wèn)題。
問(wèn)題描述:在第一次進(jìn)入當(dāng)前頁(yè)面時(shí),橫向滑動(dòng)沒(méi)有反應(yīng),豎向滑動(dòng)沒(méi)有影響,當(dāng)向上滑動(dòng)一部分后,橫向滑動(dòng)就可以了,但是如果滑動(dòng)到頂部,橫向滑動(dòng)又變的沒(méi)有反應(yīng)。另外如果滑動(dòng)的距離超過(guò)了橫向的RecycleView時(shí)或者進(jìn)入其他頁(yè)面重新返回此頁(yè)面時(shí),橫向滑動(dòng)就可以了,不會(huì)再出現(xiàn)橫向滑動(dòng)沒(méi)反應(yīng)的問(wèn)題。
問(wèn)題機(jī)型:小米6、小米mix2、華為v10(目前就發(fā)現(xiàn)此三款機(jī)型)
解決:
在RecycleView所在父布局中添加如下:
android:descendantFocusability="blocksDescendants"
具體解析請(qǐng)看 NestedScrollView、RecycleView、ViewPager 等布局方面的常見問(wèn)題匯總,及解決 中的問(wèn)題