国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 自動(dòng)滾動(dòng)的RecyclerView,手動(dòng)滑動(dòng)和自動(dòng)滑動(dòng)無縫銜接,手動(dòng)滑動(dòng)時(shí)數(shù)據(jù)不重復(fù)

這篇具有很好參考價(jià)值的文章主要介紹了Android 自動(dòng)滾動(dòng)的RecyclerView,手動(dòng)滑動(dòng)和自動(dòng)滑動(dòng)無縫銜接,手動(dòng)滑動(dòng)時(shí)數(shù)據(jù)不重復(fù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

概要

做一個(gè)自動(dòng)滑動(dòng)的列表,用于展示聊天記錄或者通知欄信息等,還是使用主流的RecyclerView來做。網(wǎng)上有很多案例,但當(dāng)手動(dòng)滑動(dòng)時(shí)會(huì)一直無限循環(huán),數(shù)據(jù)重復(fù)的出現(xiàn),如果想要自動(dòng)滑動(dòng)時(shí)能無限循環(huán),手動(dòng)滑動(dòng)時(shí)又能滑到底呢?本案例就解決這種手動(dòng)滑動(dòng)和自動(dòng)滑動(dòng)無縫銜接的問題。

思路

1、重寫RecyclerView,通過scrollBy和postDelayed進(jìn)行定時(shí)移動(dòng)到達(dá)自動(dòng)滑動(dòng)目的

2、RecyclerView添加addOnScrollListener,進(jìn)行手指按下滑動(dòng)和抬起監(jiān)聽,用于判斷是手動(dòng)滑動(dòng)還是自動(dòng)滑動(dòng)。

3、修改adapter的itemCount

4、接下來上代碼

實(shí)現(xiàn)方案

1、重寫 RecyclerView:

public class SocllRecyclerView extends RecyclerView {
    private Autoaaview autoview;
    private boolean running;
    private boolean canrun;

    private static final int Timea = 40;//控制滾動(dòng)的速度,值越大速度越慢

    public SocllRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        autoview = new Autoaaview(this);
    }

    public SocllRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }


    private class Autoaaview implements Runnable{
        WeakReference<SocllRecyclerView> myScrViewWeakReference;
        public Autoaaview(SocllRecyclerView myScrView) {
            myScrViewWeakReference = new WeakReference<>(myScrView);
        }

        @Override
        public void run() {
            SocllRecyclerView myScrView = myScrViewWeakReference.get();
            if (myScrView.canrun&&myScrView.running){
                myScrView.scrollBy(2,2);
                myScrView.postDelayed(myScrView.autoview,Timea);
            }
        }
    }
    //開始滾動(dòng)
    public void start(){
        if (running)
            stop();
        running = true;
        canrun = true;
        postDelayed(autoview,Timea);
    }
    //停止?jié)L動(dòng)
    public void stop() {
        running = false;
        removeCallbacks(autoview);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return super.onTouchEvent(e);
    }
}

2、適配器?MyscrviewAdapter

public class MyscrviewAdapter extends RecyclerView.Adapter<ViewHolder> {

    Context context;
    List<NoticeBean.RecordsBean> mies;
    private int itemCount = Integer.MAX_VALUE;

    public MyscrviewAdapter(Context context, List<NoticeBean.RecordsBean> mies) {
        this.context = context;
        this.mies = mies;
    }

    public void updateAll(List<NoticeBean.RecordsBean> list) {
        mies.clear();
        mies.addAll(list);
        notifyDataSetChanged();
    }

    /**
     * 設(shè)置狀態(tài),用于設(shè)置ItemCount的數(shù)量
     * state:1 表示正在手指滑動(dòng),itemCount設(shè)置為實(shí)際數(shù)量;
     * 其他的表示結(jié)束手動(dòng)滑動(dòng),itemCount設(shè)置為最大值Integer.MAX_VALUE
     * @param state
     */
    public void setItemCount(int state) {
        this.itemCount = state == 1 ? mies.size() : Integer.MAX_VALUE;
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(context).inflate(R.layout.item_home_news, parent, false);
        ViewHolder baseViewHolder = new ViewHolder(inflate);
        return baseViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
        holder.setText(R.id.tvNewsTitle, mies.get(position % mies.size()).getTitle());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != mItemClickListener) {
                    mItemClickListener.onItemClick(mies.get(position % mies.size()), position);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return mies.size() > 4 ? itemCount : mies.size();
    }

    //使用接口回調(diào)點(diǎn)擊事件
    private ItemClickListener mItemClickListener;

    public void setOnItemClickListener(ItemClickListener itemClickListener) {
        this.mItemClickListener = itemClickListener;
    }
    
    public interface ItemClickListener {
        void onItemClick(Object obj, int position);
    }
}

ViewHolder封裝類

public class ViewHolder extends RecyclerView.ViewHolder {
    //用于緩存已找的界面
    private SparseArray<View> mView;

    public ViewHolder(View itemView) {
        super(itemView);
        mView=new SparseArray<>();
    }
    public <T extends View> T getView(int viewId){
        //對(duì)已有的view做緩存
        View view=mView.get(viewId);
        //使用緩存的方式減少findViewById的次數(shù)
        if(view==null){
            view=itemView.findViewById(viewId);
            mView.put(viewId,view);
        }
        return (T) view;
    }
    //通用的功能進(jìn)行封裝  設(shè)置文本 設(shè)置條目點(diǎn)擊事件  設(shè)置圖片
    public ViewHolder setText(int viewId , CharSequence text){
        TextView view = getView(viewId);
        view.setText(text);
        //希望可以鏈?zhǔn)秸{(diào)用
        return this;
    }

    //通用的功能進(jìn)行封裝  設(shè)置文本 設(shè)置條目點(diǎn)擊事件  設(shè)置圖片
    public ViewHolder setText(int viewId , String text){
        TextView view = getView(viewId);
        view.setText(text);
        //希望可以鏈?zhǔn)秸{(diào)用
        return this;
    }

    public ViewHolder setSelected(int viewId ,boolean selected){
        TextView view = getView(viewId);
        view.setSelected(selected);
        //希望可以鏈?zhǔn)秸{(diào)用
        return this;
    }

    public ViewHolder setSelected2(int viewId,boolean selected){
        View view = getView(viewId);
        view.setSelected(selected);
        return this;
    }

    public ViewHolder setVisible(int viewId,boolean visible){
        View view = getView(viewId);
        view.setVisibility(visible ? View.VISIBLE : View.GONE);
        return this;
    }

    public ViewHolder setVisible(int viewId,boolean visible,boolean isLocation){
        View view = getView(viewId);
        if (isLocation){
            view.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
        }else{
            view.setVisibility(visible ? View.VISIBLE : View.GONE);
        }

        return this;
    }

    /**
     *設(shè)置本地圖片
     * @param viewId
     * @param resId
     * @return
     */
    public ViewHolder setImageResource(int viewId,int resId){
        ImageView iv=getView(viewId);
        iv.setImageResource(resId);
        return this;
    }

    public ViewHolder setTextSelected(int viewId, boolean bool) {
        TextView tv = getView(viewId);
        tv.setSelected(bool);
        return this;
    }

    /**
     *設(shè)置本地圖片
     * @param viewId
     * @param resId
     * @return
     */
    public ViewHolder setImageDrawable(Context mContext, int viewId, int resId){
        ImageView iv=getView(viewId);
        iv.setImageDrawable(mContext.getResources().getDrawable(resId));
        return this;
    }

    /**
     * 加載圖片資源路徑
     * @param viewId
     * @param imageLoader
     * @return
     */
    public ViewHolder setImagePath(int viewId,HolderImageLoader imageLoader,int res){
        ImageView iv=getView(viewId);
        imageLoader.loadImage(iv,imageLoader.getPath(),res);
        return this;
    }

    public ViewHolder setImage(Context mContext, int viewId, String url, int res) {
        ImageView view = getView(viewId);
        GlideLoadImageUtils.loadRectangleImg(mContext, view, url,res);
        return this;
    }

    public ViewHolder setCircleImage(Context mContext, int viewId, String url, int res) {
        ImageView view = getView(viewId);
        GlideLoadImageUtils.loadCircleImg(mContext, view, url,res);
        return this;
    }

    public ViewHolder setTextColor(Context mContext, int viewId, int color) {
        TextView tv = (TextView)this.getView(viewId);
        tv.setTextColor(mContext.getResources().getColor(color));
        return this;
    }

    public ViewHolder setTextSize(Context mContext, int viewId, float res) {
        TextView tv = (TextView)this.getView(viewId);
        tv.setTextSize(Utils.dp2px(mContext,res));
        return this;
    }

    @SuppressLint("NewApi")
    public ViewHolder setBackground(Context mContext, int viewId, int bg) {
        TextView tv = (TextView)this.getView(viewId);
        tv.setBackground(mContext.getResources().getDrawable(bg));
        return this;
    }

    /**
     * 關(guān)于事件的
     */
    public ViewHolder setOnClickListener(int viewId, View.OnClickListener listener) {
        View view = getView(viewId);
        view.setOnClickListener(listener);
        return this;
    }

    public abstract static class HolderImageLoader{
        public String mPath;
        public Context mContext;
        public HolderImageLoader(Context mContext, String path){
            this.mPath=path;
            this.mContext = mContext;
        }

        /**
         * 需要去復(fù)寫這個(gè)方法加載圖片
         * @param iv
         * @param path
         */
        public abstract void loadImage(ImageView iv, String path, int res);
        public String getPath(){
            return mPath;
        }
    }

}

3、activity中使用

? ? ?RecyclerView滑動(dòng)監(jiān)聽,注釋都說的很詳細(xì)

/**
     * 控制通知公告數(shù)據(jù)滾動(dòng)
     * 手指滑動(dòng)時(shí) 停止自動(dòng)滾動(dòng)
     * 手指抬起時(shí),3秒后自動(dòng)開始滾動(dòng)
     */
    private void initRlvNews() {
        scroHandler = new Handler();//定義handler
        runnable = () -> {  //runnable方法,處理延時(shí)后的操作
            newsAdapter.setItemCount(0);//0表示手指已經(jīng)抬起來了
            rlvNews.start(); //開始滑動(dòng)
        };
        rlvNews.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (null != newsAdapter) {
                    if (newState == 1) {//newState的值:1 手指按下拖拽滾動(dòng),2自動(dòng)滾動(dòng)(一般指慣性滾動(dòng)),0 禁止沒有滾動(dòng)
                        rlvNews.stop();//停止自動(dòng)滾動(dòng)
                        newsAdapter.setItemCount(newState);
                    } else {
                        scroHandler.removeCallbacks(runnable);//清除runnable重新開始
                        //這里設(shè)置3秒是預(yù)估了手指滑動(dòng)抬起再滑動(dòng)的時(shí)間,提升體驗(yàn)
                        scroHandler.postDelayed(runnable, 3000);
                    }
                }
            }
        });
    }

4、布局文件:

??需要給固定高度

<com.anyi.credit.bank.view.SocllRecyclerView
 android:id="@+id/rlvNews"
 android:layout_width="match_parent"
 android:layout_height="144dp"/>

5、數(shù)據(jù)綁定

?????????rlvNews.setLayoutManager()//可設(shè)置水平滾動(dòng)或豎直滾動(dòng)布局

????????MyscrviewAdapter adpter=new?MyscrviewAdapter(this,list)

????????rlvNews.setAdapter(adpter)

? ? ? ? //關(guān)鍵,條件自定義,如當(dāng)列表數(shù)據(jù)大于4條時(shí)開始滑動(dòng)

? ? ? ? if(list.size()>4){

????????????????rlvNews.start(); //開始滑動(dòng)

????????}文章來源地址http://www.zghlxwxcb.cn/news/detail-816609.html

結(jié)束------------

到了這里,關(guān)于Android 自動(dòng)滾動(dòng)的RecyclerView,手動(dòng)滑動(dòng)和自動(dòng)滑動(dòng)無縫銜接,手動(dòng)滑動(dòng)時(shí)數(shù)據(jù)不重復(fù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • android:RecyclerView交互動(dòng)畫(上下拖動(dòng),左右滑動(dòng)刪除)

    android:RecyclerView交互動(dòng)畫(上下拖動(dòng),左右滑動(dòng)刪除)

    @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //監(jiān)聽側(cè)滑;1.刪除數(shù)據(jù),2.調(diào)用adapter.notifyItemRemoved(position) mMoveCallback.onItemRemove(viewHolder.getAdapterPosition()); } //改變選中的Item @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { //判斷狀態(tài) if

    2024年04月12日
    瀏覽(89)
  • Android RecyclerView AsyncListUtil手動(dòng)刷新fillData,kotlin

    Android RecyclerView AsyncListUtil手動(dòng)刷新fillData,kotlin

    Android RecyclerView AsyncListUtil手動(dòng)刷新fillData,kotlin Android RecyclerView paging/pager/page implements based on AsyncListUtil,kotlin_zhangphil的博客-CSDN博客 基于Android官方Paging Library的RecyclerView分頁加載框架我之前寫了一篇RecyclerView分頁加載機(jī)制的文章,是基于Android官方的AsyncListUtil實(shí)現(xiàn)的,詳情見

    2024年02月13日
    瀏覽(23)
  • Android之解決RecyclerView與NestedScrollView的滑動(dòng)沖突方法

    Android之解決RecyclerView與NestedScrollView的滑動(dòng)沖突方法

    問題一:當(dāng)我們滑動(dòng)RecyclerView組件時(shí),上方的輪播圖并沒有進(jìn)行滑動(dòng)(NestedScrollView沒有滑動(dòng),即滑動(dòng)事件被RecyclerView消費(fèi)了), 當(dāng)RecyclerView滑到底時(shí),輪播圖部分才進(jìn)行滑動(dòng) 。 如下圖,RecyclerView已經(jīng)進(jìn)行了滑動(dòng),但輪播圖部分沒有。 整體布局 這并不符合我們的設(shè)計(jì)要求,

    2024年02月16日
    瀏覽(25)
  • 任務(wù)14、無縫銜接,MidJourney瓷磚(Tile)參數(shù)制作精良貼圖

    任務(wù)14、無縫銜接,MidJourney瓷磚(Tile)參數(shù)制作精良貼圖

    在這個(gè)實(shí)驗(yàn)任務(wù)中,我們將深入探索《Midjourney Ai繪畫》中的Tile技術(shù)和其在藝術(shù)創(chuàng)作中的具有挑戰(zhàn)性的應(yīng)用。此任務(wù)將通過理論學(xué)習(xí)與實(shí)踐操作相結(jié)合的方式,讓參與者更好地理解Tile的核心概念,熟練掌握如何在Midjourney平臺(tái)上使用Tile參數(shù),并實(shí)際運(yùn)用到AI繪畫的創(chuàng)作中。 首

    2024年02月14日
    瀏覽(25)
  • python與adb無縫銜接控制手機(jī)(手機(jī)截屏實(shí)例)

    python與adb無縫銜接控制手機(jī)(手機(jī)截屏實(shí)例)

    目錄 連接 常用操作 截圖到PC端 使用pure-python-adb庫可以實(shí)現(xiàn)python控制手機(jī),支持input輸入,支持shell命令,支持pull/push上傳下載文件等。 安裝庫:pip install?pure-python-adb 電腦端需要安裝adb程序,在命令行窗口啟動(dòng)adb程序,如下: 連接 常用操作 截圖到PC端

    2024年02月11日
    瀏覽(20)
  • 解決Android中使用RecyclerView滑動(dòng)時(shí)底部item顯示不全的問題

    感覺這個(gè)bug是不是因人而異啊,找了很多文章都沒能解決我的問題,包括在RecyclerView上在嵌套上一層RelativeLayout,添加屬性android:descendantFocusability=”blocksDescendants”,使用ConstraintLayout布局包裹RecyclerView,再設(shè)置layout_height=\\\"0dp\\\"和layout_constraintBottom_toBottomOf=\\\"parent\\\"(就是指定約束

    2024年02月16日
    瀏覽(23)
  • vue video 播完第一個(gè)視頻以后,再無縫銜接第二個(gè)視頻并循環(huán)播放

    vue video 播完第一個(gè)視頻以后,再無縫銜接第二個(gè)視頻并循環(huán)播放

    這是一個(gè)項(xiàng)目中的實(shí)際需求,特此記錄一下 頁面中創(chuàng)建兩個(gè) video 標(biāo)簽 在組件加載時(shí)同時(shí)加載兩個(gè)視頻資源( autoplay ), 暫時(shí)不播放的視頻在 canpl 了解規(guī)則 ay 事件中調(diào)用暫停方法,使之實(shí)現(xiàn)預(yù)加載 使用絕對(duì)定位將預(yù)加載的視頻移出可視窗口 第一個(gè)視頻結(jié)束后,通過 ended 事件

    2024年02月12日
    瀏覽(15)
  • Vue 之 vue-seamless-scroll 實(shí)現(xiàn)簡(jiǎn)單自動(dòng)無縫滾動(dòng),且添加對(duì)應(yīng)點(diǎn)擊事件的簡(jiǎn)單整理

    Vue 之 vue-seamless-scroll 實(shí)現(xiàn)簡(jiǎn)單自動(dòng)無縫滾動(dòng),且添加對(duì)應(yīng)點(diǎn)擊事件的簡(jiǎn)單整理

    目錄 Vue 之 vue-seamless-scroll 實(shí)現(xiàn)簡(jiǎn)單自動(dòng)無縫滾動(dòng),且添加對(duì)應(yīng)點(diǎn)擊事件的簡(jiǎn)單整理 一、簡(jiǎn)單介紹 二、安裝和使用 三、效果圖 四、vue-seamless-scroll 點(diǎn)擊事件實(shí)現(xiàn)原理 ?五、簡(jiǎn)單實(shí)現(xiàn) ?六、關(guān)鍵代碼 Vue 開發(fā)的一些知識(shí)整理,方便后期遇到類似的問題,能夠及時(shí)查閱使用。 本

    2024年02月09日
    瀏覽(25)
  • [Unity學(xué)習(xí)]使用ScrollRect實(shí)現(xiàn)自動(dòng)滾動(dòng)到底部顯示實(shí)時(shí)消息,并在拖動(dòng)的時(shí)候取消自動(dòng)滾動(dòng),再次手動(dòng)滑到底部,又繼續(xù)自動(dòng)滾動(dòng)

    [Unity學(xué)習(xí)]使用ScrollRect實(shí)現(xiàn)自動(dòng)滾動(dòng)到底部顯示實(shí)時(shí)消息,并在拖動(dòng)的時(shí)候取消自動(dòng)滾動(dòng),再次手動(dòng)滑到底部,又繼續(xù)自動(dòng)滾動(dòng)

    首先需要重寫ScrollRect組件: 下面通過協(xié)程實(shí)現(xiàn)在不滾動(dòng)ScrollRect的時(shí)候,自動(dòng)滾動(dòng)到底部。 使用時(shí),寫下面類似代碼即可: Unity原生Scroll View更改配置如下: 其中ScrollView游戲物體更改組件如下: content配置如下: 實(shí)現(xiàn)效果如下: 大功告成!加上對(duì)象池模式控制添加的text實(shí)例

    2024年02月16日
    瀏覽(114)
  • Cocos creator(2d) 使用 shader + uv 實(shí)現(xiàn)單張圖片銜接滾動(dòng)效果

    Cocos creator(2d) 使用 shader + uv 實(shí)現(xiàn)單張圖片銜接滾動(dòng)效果

    在游戲中,當(dāng)我們需要讓背景圖片無縫銜接無限滾動(dòng)時(shí)(打飛機(jī)這種背景一直滾動(dòng),或者肉鴿游戲地圖一直在走等等),通常的做法是 在游戲中放兩個(gè)背景node,在update中控制這兩張背景圖片的移動(dòng),并讓其收尾銜接即可。(具體代碼忽略) 可是在肉鴿類游戲中,玩家的走向是全方

    2024年02月13日
    瀏覽(74)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包