日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android RecyclerView 向上偏移解决、添加自定义分割线,瀑布流,ScrollView嵌套RecyclerView滑动卡顿

發布時間:2023/12/10 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android RecyclerView 向上偏移解决、添加自定义分割线,瀑布流,ScrollView嵌套RecyclerView滑动卡顿 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?向上偏移解決

android:focusableInTouchMode="true" android:focusable="true" android:fillViewport="true"

?

卡頓解決方法

recyclerViewwg.setHasFixedSize(true); recyclerViewwg.setNestedScrollingEnabled(false);

刪除條目:

lists.remove(i); notifyItemRemoved(i); notifyDataSetChanged();

mRecyclerview.invalidate();====mRecyAdapter.notifyDataSetChanged();

?

概述

RecyclerView出現已經有一段時間了,相信大家肯定不陌生了,大家可以通過導入support-v7對其進行使用。
據官方的介紹,該控件用于在有限的窗口中展示大量數據集,其實這樣功能的控件我們并不陌生,例如:ListView、GridView。

那么有了ListView、GridView為什么還需要RecyclerView這樣的控件呢?整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現令人瞠目的效果。

  • 你想要控制其顯示的方式,請通過布局管理器LayoutManager
  • 你想要控制Item間的間隔(可繪制),請通過ItemDecoration
  • 你想要控制Item增刪的動畫,請通過ItemAnimator
  • 你想要控制點擊、長按事件,請自己寫(擦,這點尼瑪。)

一.RecyclerView介紹

RecyclerView 是Android 5.0版本中新出現的東西,用來替代ListView和GridView的。

二.RecyclerView架構

RecyclerView使用布局管理器LayoutManager和適配器Adapter的適配器模式去實現架構,不關心數據的來源。耦合性非常的底,用戶可以根據自己的用戶界面去實現相應的效果

三.RecyclerView的優點

  • 1.RecyclerView內部已經強制使用VIewHolder,優化了對Item中View的復用。

  • 2.提供了一個較為靈活的布局管理類,LayoutManager,用來控制RecyclerView是線性展示還是垂直展示,以及可以設置成瀑布流。并且提供了ItemDecoration這個類,來靈活的讓用戶來設置分割線。

  • 3.用ItemAnimator可以對item進行布局的刪減動畫效果。

?

設置布局管理器:

1、豎向listview

rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

2、橫向listview

rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));

3、豎向gridView

rv.setLayoutManager(new GridLayoutManager(this, 5));

4、橫向gridview

rv.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); rv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL));

5、瀑布流

rv.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); rv.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL));

瀑布流實現效果

?

?實現方法

item類型設置

for (int a=0;a<8;a++){TuijianMainEntity tuijianEntity =new TuijianMainEntity();tuijianEntity.setUname("網吧"+a);if (a>0){if (iflong){tuijianEntity.setIflong(iflong);intlonglg++;if (intlonglg==2){iflong=!iflong;intlonglg=0;}}else {tuijianEntity.setIflong(iflong);intlonglg++;if (intlonglg==2){iflong=!iflong;intlonglg=0;}}}barEntityList.add(tuijianEntity); }

設置左右間隙

if (position%2==0){holder.itemView.setPadding(12,28,12,0);}else {holder.itemView.setPadding(12,28,12,0); }

設置圖片高度

if (entityList.get(position).isIflong()){int h = (int)Math.floor(heightlg*4/7)-130;int igh = h-210; // setViewLayoutParams(holder.myli,h);setigLayoutParams(holder.myig,igh);}else {int h = (int)Math.floor(heightlg*3/7)-80;int igh = h-160; // setViewLayoutParams(holder.myli,h);setigLayoutParams(holder.myig,igh);}

item_layout 自適應高度wrap_content

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:background="@color/bg_list"android:layout_height="wrap_content"><LinearLayoutandroid:id="@+id/myli"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:background="@drawable/kongwhitebg">

?

需在adapter隨機設置高度

rvAdapter.setType(3); private int type = 0;public RvAdapter(Context context, List<Integer> datas) {this.context = context;this.datas = datas;for (int i : datas) {int height = (int) (Math.random() * 100 + 300);heights.add(height);} }public void setType(int type) {this.type = type; } @Override public void onBindViewHolder(MyViewHolder holder, final int position) {RecyclerView.LayoutParams layoutParams;if (type == 0) {layoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);} else if (type == 1) {layoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);} else {layoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, heights.get(position));layoutParams.setMargins(2, 2, 2, 2);}

設置Item增加、移除動畫:

rv.setItemAnimator(new DefaultItemAnimator());

實現添加分割線:

1、添加默認分割線

//分割線 private RecyclerView.ItemDecoration itemDecoration; itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); //默認分割線mHistoryRecycle.addItemDecoration(itemDecoration);

2、添加自定義分割線

mHistoryRecycle.addItemDecoration(new RecyclerViewDivider(this, LinearLayoutManager.HORIZONTAL,15, R.color.video_btn_danmaku_control_color, 2, 0));

自定義類RecyclerViewDivider

import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.annotation.ColorRes; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View;import com.baidu.api.Util; import com.juejinchain.android.R;/*** 作者:created by meixi* 郵箱:15913707499@163.com* 日期:2019/6/14 08*/ public class RecyclerViewDivider extends RecyclerView.ItemDecoration {private Paint mPaint;private Drawable mDivider;private int mDividerSize = 2;//分割線高度,默認為1pxprivate int mOffsetStart = 0;private int mOffsetEnd = 0;private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTALprivate static final int[] ATTRS = new int[]{android.R.attr.listDivider};/*** 默認分割線:高度為2px,顏色為灰色** @param context* @param orientation 列表方向*/private RecyclerViewDivider(Context context, int orientation) {if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {throw new IllegalArgumentException("請輸入正確的參數!");}mOrientation = orientation;final TypedArray a = context.obtainStyledAttributes(ATTRS);mDivider = a.getDrawable(0);a.recycle();}/*** 自定義分割線** @param context* @param orientation 列表方向* @param drawableId 分割線圖片*/public RecyclerViewDivider(Context context, int orientation, int drawableId) {this(context, orientation);mDivider = ContextCompat.getDrawable(context, drawableId);mDividerSize = mDivider.getIntrinsicHeight();}/*** 自定義分割線** @param context* @param orientation 列表方向* @param dividerSize 分割線高度* @param dividerColor 分割線顏色*/public RecyclerViewDivider(Context context, int orientation, int dividerSize, @ColorRes int dividerColor) {this(context, orientation);mDividerSize = dividerSize;mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(context.getResources().getColor(dividerColor));mPaint.setStyle(Paint.Style.FILL);}/*** 自定義分割線** @param context context* @param orientation 列表方向* @param dividerHeight 分割線高度* @param dividerColor 分割線顏色* @param offsetStart 起始偏移量* @param offsetEnd 結束偏移量*/public RecyclerViewDivider(Context context, int orientation, int dividerHeight, @ColorRes int dividerColor, int offsetStart, int offsetEnd) {this(context, orientation);mDividerSize = dividerHeight;mOffsetStart = dip2px(context, offsetStart);mOffsetEnd = dip2px(context, offsetEnd);mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);if (dividerColor == 0) {dividerColor = R.color.red_500;}mPaint.setColor(context.getResources().getColor(dividerColor));mPaint.setStyle(Paint.Style.FILL);}public static int dip2px(Context context, float dipValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dipValue * scale + 0.5f);}//重寫此方法,防止設置的波紋背景把分隔線覆蓋掉。@Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {RecyclerView.ViewHolder childViewHolder = parent.getChildViewHolder(view);if (childViewHolder.getItemViewType() != 0) {outRect.set(0, 0, 0, 0);return;}if (mOrientation == LinearLayoutManager.HORIZONTAL) {outRect.set(0, 0, 0, mDividerSize);} else {outRect.set(0, 0, mDividerSize, 0);}}//繪制分割線@Overridepublic void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {if (mOrientation == LinearLayoutManager.VERTICAL) {drawVertical(c, parent);} else {drawHorizontal(c, parent);}}//繪制橫向 item 分割線private void drawHorizontal(Canvas canvas, RecyclerView parent) {final int left = parent.getPaddingLeft() + mOffsetStart;final int right = parent.getMeasuredWidth() - (parent.getPaddingRight() + mOffsetEnd);final int childSize = parent.getChildCount();for (int i = 0; i < childSize ; i++) {final View child = parent.getChildAt(i);RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getBottom() + layoutParams.bottomMargin;final int bottom = top + mDividerSize;if (mDivider != null) {mDivider.setBounds(left, top, right, bottom);mDivider.draw(canvas);}if (mPaint != null) {canvas.drawRect(left, top, right, bottom, mPaint);}}}//繪制縱向 item 分割線private void drawVertical(Canvas canvas, RecyclerView parent) {final int top = parent.getPaddingTop() + mDividerSize;final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom() + mDividerSize;final int childSize = parent.getChildCount();for (int i = 0; i < childSize; i++) {final View child = parent.getChildAt(i);RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getRight() + layoutParams.rightMargin;final int right = left + mDividerSize;if (mDivider != null) {mDivider.setBounds(left, top, right, bottom);mDivider.draw(canvas);}if (mPaint != null) {canvas.drawRect(left, top, right, bottom, mPaint);}}} }

?

?

?

總結

以上是生活随笔為你收集整理的Android RecyclerView 向上偏移解决、添加自定义分割线,瀑布流,ScrollView嵌套RecyclerView滑动卡顿的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩久久影院 | 国产剧情自拍 | 中文字幕资源站 | 精品久久视频 | 精品国产伦一区二区三区 | 日韩欧美精品在线观看 | 免费视频www在线观看网站 | 午夜精品久久久 | 成人精品影院 | 成年人黄色片网站 | 有机z中国电影免费观看 | 福利网站在线 | 饥渴少妇勾引水电工av | 久久久精彩视频 | 成人免费无码大片a毛片 | 操操操综合| 在线观看国产一区 | 永久免费在线看片 | 涩涩成人网 | 91精品国产视频 | 久久亚洲在线 | 波多野结衣av在线免费观看 | 欧美亚洲自拍偷拍 | 99视频网站 | 亚洲国产精品国自产拍av | 一区二区三区视频在线免费观看 | 亚洲免费视频一区二区 | 99精品视频一区二区 | 日本一区不卡在线观看 | 国产香蕉视频在线 | 99爱爱| 欧洲丰满少妇做爰 | 好吊妞视频一区二区三区 | 国产成人主播 | 国产做受网站 | 最新国产毛片 | 一区二区免费在线视频 | xx性欧美肥妇精品久久久久久 | 亚洲视频在线观看网址 | 欧美一区二区影院 | 99精品99| 亚洲高清av在线 | 巨茎人妖videos另类 | 日韩欧美综合在线 | 免费视频中文字幕 | 精品一区二区三区av | 久久青青草原 | 曰批视频在线观看 | 欧美黄色性 | 久久久久亚洲精品 | 一本一道av| 久爱视频在线 | 爱爱爱免费视频 | 日韩资源在线观看 | 久久综合区| 亚洲欧美国产一区二区 | 五月天久久婷婷 | 日本一二三区视频在线 | 成人黄色短片 | 免费黄色网址在线观看 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 久久撸视频 | 精品无码m3u8在线观看 | 熟妇高潮一区二区高潮 | 深喉口爆一区二区三区 | 国产精品久久久精品三级 | 手机免费av | 婷婷六月丁 | 男人看片网站 | 日本va在线观看 | 欧美不卡网 | 欧美人在线 | 欧美一区二区免费 | 成人网页在线观看 | 国产日韩免费视频 | 国产精品丝袜视频 | 黄色一级片免费播放 | 国产天天操 | 在线播放av网站 | 国产精品久久av无码一区二区 | 国内外成人在线视频 | 狠狠干中文字幕 | 欧美77777| 欧美视频在线观看 | 日本免费不卡 | 毛片毛片毛片毛片毛片毛片 | 2019国产精品视频 | 午夜老司机免费视频 | 在线视频观看一区 | 国产亚洲黄色片 | 欧美精品不卡 | 天天干天天看 | 法国空姐在线观看免费 | 影音先锋啪啪 | 国产一二三精品 | 动漫美女靠逼 | 95在线视频 | 日本a级黄 | 日韩高清在线一区 |