當前位置:首頁 » 安卓系統 » androiditem間距

androiditem間距

發布時間: 2023-05-31 22:06:10

A. android開發,listview item間有間距怎麼弄不是固定的每個之間。有時候是一個和兩

用唯源兩層listview,第一個listview的答虛adapter裡面放的還是listview,第二層裡面再放你要放的元素,這樣的話你設置好第指舉態一層listview的元素間距就好

B. 1.Android recycleView萬能分隔線 GridLayoutManager布局item左右間距均等(最易懂)

今天開始講RecycleView的系列教程。分割線,分組,局部刷新,動態添加,緩存原理,抖音效果,瀑布流。嵌套,動畫等等

RecyclerView的分割線是通過canvas和設置item偏移畫出來的.需要知道2個方法

getItemOffsets()和onDraw方法

getItemOffsets 是針對每一個 ItemView

onDraw:遍歷,進行顏色修改

我們可以看到自定義的 TestDividerItemDeoration 只實現了一個方法 getItemOffsets()。方法裡面有四個參數。

Rect outRect

View view

RecyclerView parent

RecyclerView.State state

綠色區域代表 RecyclerView 中的一個 ItemView,而外面橙色區域也就是相應的 outRect,也就是 ItemView 與其它組件的偏移區域,等同於 margin 屬性,通過復寫 getItemOffsets() 方法,然後指定 outRect 中的 top、left、right、bottom 就可以控制各個方向的間隔了。

這實現了簡單的分隔線效果,但這種方法分隔線的效果只能取決於背景色,如果我要定製分割線的顏色呢?這個時候就要 onDraw()。

————————————————

源碼分析:在recycleview中的

分割線要注意,沒有顏色,默認是白色的,會看不出來

第一種方案,通過

getItemOffsets()方法進行分割線!

判斷是否是第一個,最後一個,是單個還是雙個,是什麼類型

/***

* 分割線要注意,沒有顏色,默認是白色的,會看不出來

* @param outRect

* @param view

* @param parent

* @param state

*/

private void testItemOffset(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

int childAdapterPosition = parent.getChildAdapterPosition(view);

    if (childAdapterPosition ==0) {

outRect.set(0, 20, 0, 20);

    }else {

outRect.set(0, 0, 0, 20);

    }

}

第二種方案:ondraw()

@Override

public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {

super.onDraw(c, parent, state);

    int childCount = parent.getChildCount();

    for (int i =0; i < childCount; i++) {

View view = parent.getChildAt(i);

        int index = parent.getChildAdapterPosition(view);

        //第一個ItemView不需要繪制

        if (index ==0) {

continue;

        }

float dividerTop = view.getTop() -mDividerHeight;

        float dividerLeft = parent.getPaddingLeft();

        float dividerBottom = view.getTop();

        float dividerRight = parent.getWidth() - parent.getPaddingRight();

        c.drawRect(dividerLeft, dividerTop, dividerRight, dividerBottom, mPaint);

    }

}

 GridLayoutManager布局item左右間距均等

思路分析

首先,我們知道,對於 GridLayoutmanager ,當我們設置的 spancount 為 3 的時候,那麼每個 item 的最大寬度為 itemMaxW = recycylerW / spancount = recycylerW / 3.

假設我們 spancount 為 3,那麼在不設置 itemDercation 的情況下它的分布是這樣的,可以看到第一列與最後一行的距離是不一樣的

GridVIew出現的問題:本來固定item.高度和寬度

1.分割線有,不是理想的,左右均等

2.上下沒有分割線

源碼得到:

按上面分析的源碼,我們可以知道,調用outRect.set(int left, int top, int right, int bottom)方法時,left一直為0,right一直為divider的寬度,而每一項item的寬度都要減去(left+right)大小,

left一直為0,right一直為divider的寬度

左上右下到底是什麼的值?

計算每一個item移動的距離,左邊和右邊的移動距離

計算分析:

1.左邊的分割線寬度為sW  (已知)

2.每個顯示item的寬度,布局定義的itemWidth

3. 總共分割線寬度:totalDivider=屏幕寬度-spanCount*itemWidth

4.列之間的分割線寬度為dw   =(屏幕寬度-spanCount*item-2*sW )/(spantcount-1)

5.每個item需要留出的空間 ew=totalDivider/spanCount(即paddingLeft+paddingRight)

left:  左邊的間距值(絕對值,差值)

right:右邊的間距值

每個item移動的距離:

第一個Item:L0=sW                                  R0=eW-sW

第二個Item:L1=dW-R0=dW-eW+sW       R1=eW-L1=2eW-dW-sW

第三個Item:L2=dW-R1=2(dW-eW)+sW   R2=eW-L2=3eW-2dW-sW

得出公式:

Ln=(position%spanCount)*(dw-ew)+sw

Rn=ew-Ln

總結:得到3個值dw,ew, sw的值

sw:左邊的距離

ew:每個的平均的分割線

dw: 列之間的分割線寬度

int firstLastSpace =50;//最左邊的分割線寬度

@SuppressLint("LongLogTag")

@Override

public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

super.getItemOffsets(outRect, view, parent, state);

    count++;

    outRect.top =20;

    mDividerHeight =0;

    int itemWidth =dip2px(context, 100);

    int screenWidth = getScreenWidth(context);

    int dw = (screenWidth -3 * itemWidth -2 *firstLastSpace) /2;//最終計算出這個padding值

    //誤區:中間的分割線的總距離,左右可能是不等的

    int totalDivder = screenWidth -3 * itemWidth;

    Log.d("TestDividerItemDecoration", "totalDivder" + totalDivder);

    int eachDivder = totalDivder /3;

    int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();

    //不要用for循環

    outRect.left = (itemPosition %3) * (dw - eachDivder) +firstLastSpace;

    outRect.right = eachDivder - outRect.right;

}

錯誤的思路:

//誤區:中間的分割線的總距離,左右可能是不等的

//不要用for循環

int firstLastSpace =50;//最左邊的分割線寬度

@SuppressLint("LongLogTag")

@Override

public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

super.getItemOffsets(outRect, view, parent, state);

    count++;

    outRect.top =20;

    mDividerHeight =0;

    int itemWidth =dip2px(context, 100);

    int screenWidth = getScreenWidth(context);

    int padding = (screenWidth -3 * itemWidth -2 *firstLastSpace) /4;//最終計算出這個padding值

    //不能這么算,必須保證每個item的分割線一樣才行。

    Log.d("TestDividerItemDecoration", "getItemOffsets" +count +"item寬度:" + itemWidth +"padding" + padding);

    //僅僅計算左邊和右邊的距離

    int childCount = parent.getChildCount();

    for (int i =0; i < childCount; i++) {

if (i %3 ==0) {//最左邊的item

            outRect.left =firstLastSpace;

            outRect.right = padding;

        }else if (i %3 ==1) {

outRect.left = padding;

            outRect.right = padding;

        }else if (i %3 ==2) {

outRect.left = padding;

            outRect.right =firstLastSpace;

        }

}

}

瀑布流的設置:

int spanIndex = layoutParams.getSpanIndex();

public class FeedDecorationextends RecyclerView.ItemDecoration {

private ;

    public FeedDecoration(HomePageCardAdapter mHomePageCardAdapter) {

this.mHomePageCardAdapter = mHomePageCardAdapter;

    }

@Override

    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {

if (mHomePageCardAdapter ==null) {

return;

        }

if (mHomePageCardAdapter.getItemViewType(parent.getChildAdapterPosition(view)) == HomePageMultipleCard.HOMEPAGE_MULTIPLE_CARD_TYPE_FITNESS_FEED) {

StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();

            int spanIndex = layoutParams.getSpanIndex();

            if (spanIndex ==0) {

outRect.set(DensityUtil.dip2px(ShadowApp.context(), 14), 0, DensityUtil.dip2px(ShadowApp.context(), 5), DensityUtil.dip2px(ShadowApp.context(), 10));

            }else {

outRect.set(DensityUtil.dip2px(ShadowApp.context(), 5), 0, DensityUtil.dip2px(ShadowApp.context(), 14), DensityUtil.dip2px(ShadowApp.context(), 10));

            }

}

}

}

demo地址: https://github.com/pengcaihua123456/shennanda

C. android 控制項之間的間距怎麼調整

控制項之間的間距有兩種設置:
android:layout_margin="10dp" 外邊距

android:padding="10dp" 內邊距

有五個屬性控制控制項的間距,分別是
android:layout_marginLeft
android:layout_marginRight
android:layout_marginTop
android:layout_marginBottom
android:layout_margin
可以控制控制項之間的距離,分別是左間距,右間距,上間距,下間距,和四邊統一間距
android:layout_marginTop="25dip" //頂部距離 就這樣寫代碼
福建蜂鳥雲商為你解答

D. android自定義listview item間距顏色屬性,

也就是2個item之間的那根線是吧,ListView自己提供了方法的,ListView.setDivider(「你要修改的顏色(最好放一張圖片)」);就是這個方法,可以解決你的問題。

E. 安卓怎麼設置listview行間距

listView每一個item中放置的是viewGroup對象,比如說是LinearLayout,那麼LinearLayout設置padding屬性的值,就可以調整每一個item的上下間距,也可以利用margin屬性。總之,pading和margin這兩個綜合運用,很多問題都可以解決。下面安卓無憂中有各種listView的demo,點擊源碼,可以查看源碼,網路安卓無憂就可以,下面是演示:


ps:如果您對回答滿意,請關注一下名字中帶的微博(除了中文以外的是微博名)。

F. 安卓中如何設置listview 最後一個item距頂部高度,就是最後一個間距和其他不一樣

設置listView的item間距,可以在xml布局銀祥文件中的listView下設置xml屬性:
android:divider="#00000000"
android:dividerHeight="18dp"
解釋:分隔線頌乎透明,高度為野搏悉18dp。

熱點內容
易語言問道源碼 發布:2025-02-09 12:59:03 瀏覽:660
ip和伺服器有關嗎 發布:2025-02-09 12:51:26 瀏覽:949
極光免費腳本 發布:2025-02-09 12:50:33 瀏覽:393
c存儲過程返回結果集 發布:2025-02-09 12:42:00 瀏覽:149
gs哪個配置性價比高 發布:2025-02-09 12:35:57 瀏覽:282
java棧數組 發布:2025-02-09 12:33:37 瀏覽:555
php上傳文件form 發布:2025-02-09 12:33:31 瀏覽:156
冠道如何選擇配置 發布:2025-02-09 12:20:21 瀏覽:970
為什麼安卓手機wearpro搜不到手錶 發布:2025-02-09 12:16:07 瀏覽:670
伺服器安全怎麼做 發布:2025-02-09 12:08:08 瀏覽:484