android 积累一些RecycylerView的常见用法

RecyclerView简单的实现折叠效果 以上只是实现了一个简单的二级折叠列表,可以使用相同的思路实现三级四级,比较重要的是数据结构!也可以使用getItemViewType实现多布局,将parent和children的样式分开来写。本实例使用了dataBinding,感兴趣的可以先去学习一下。不喜勿喷,只是为了赚点积分以后下载和抄袭别人的代码。RecyclerView折叠效果。四、itemView。 阅读详情

RecyclerView 过滤数据(既能显示全部数据又能显示过滤后的数据)


最近在项目中遇到这么一个需求:用一个列表加载所有的消息数据,有两个按钮,一个按钮点击了显示全部消息的列表,一个按钮点击了显示未读消息的列表。

思路:过滤器

        过滤条件

 

1.首先是recyclerview  的适配器 要备份原来的数据并且要实现      implementsFilterable

    private List<AllNotification.ResultBean> mDataList;
    private List<AllNotification.ResultBean> backData;//用来备份原始数据
    private CheckBox cb_quanxuan;
    private NewsFilter newsFilter;


    public NormalRecyclerViewAdapter(Context mContext, List<AllNotification.ResultBean> mDataList, CheckBox cb_quanxuan) {
        this.mContext = mContext;
        this.mDataList = mDataList;
        this.cb_quanxuan = cb_quanxuan;
        mInflater = LayoutInflater.from(mContext);
        backData=mDataList;
    }




    @Override
    public Filter getFilter() {
        if (newsFilter ==null){
            newsFilter = new NewsFilter();
        }
        return newsFilter;
    }

2.实现过滤器

private class NewsFilter extends  Filter{
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            FilterResults result = new FilterResults();
            List<AllNotification.ResultBean> list = null;


            if (TextUtils.isEmpty(charSequence)){//当过滤的关键字为空的时候,我们则显示所有的数据
                list  = backData;
            }else  if (charSequence.equals("1")){
                //显示全部
                list=backData;

            }else if (charSequence.equals("0")){
                //显示未读
                list = new ArrayList<AllNotification.ResultBean>();
                for (AllNotification.ResultBean recomend:backData){
                    if (recomend.getStatus().equals("1")){

                        list.add(recomend);
                    }

                }
            }
            result.values = list; //将得到的集合保存到FilterResults的value变量中
            result.count = list.size();//将集合的大小保存到FilterResults的count变量中

            return result;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults filterResults) {
            mDataList = (List<AllNotification.ResultBean>)filterResults.values;

            if (filterResults.count>0){
                notifyDataSetChanged();//通知数据发生了改变

            }/*else {
                notifyDataSetInvalidated();//通知数据失效
                LogUtil.d("publishResults:notifyDataSetInvalidated");
            }*/
        }
    }

3.设置过滤器

   RxView.clicks(tv_xianshiquanbu).throttleFirst(2,TimeUnit.SECONDS).subscribe(new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
                tv_xianshiquanbu.setTextColor(Color.parseColor("#888888"));
                tv_xianshiweidu.setTextColor(Color.parseColor("#cccccc"));
                mAdapter.getFilter().filter("1");
            }
        });

RecyclerView 对数据进行分类

1.重写getItemViewType方法

   @Override
    public int getItemViewType(int position) {
        if (mDataList != null && mDataList.get(position).getCataid().equals("4")) {
            return ORIGINAL;
        } else {
            return FORWARD;
        }
    }

2.根据不同的分类加载不同的View

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType==ORIGINAL){
            return new DynamicViewHolder(mInflater.inflate(R.layout.item_dongtai_yuanchuang, parent, false), viewType, 0);

        }else{
            return new ZhuanViewHolder(mInflater.inflate(R.layout.item_dongtai, parent, false), viewType, 0);
        }
        
    }


RecyclerView添加头部与尾部


仿造ListView添加addHeaderView与addFooterView

原理:在ListView中添加头部或者尾部,是在原有的基础的adpter上,添加了一个装饰的adapter:
HeaderViewListAdapter
也就是在原有的基础上,将数据分为三部分:头部,中部,底部,用getViewType来区别数据

package costomview.mycustomrecyclerview;

import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HeaderViewListAdapter;


import adapter.CommonViewHolder;


/**
 * Created by Administrator on 2017/4/19 0019.
 */

public class WrapRecyclerAdapter extends RecyclerView.Adapter<CommonViewHolder> {

    private static final String TAG = "WrapRecyclerAdapter";

    private SparseArray<View> mHeaderViews;
    private SparseArray<View> mFooterViews;


    //头部开始的位置
    private static int BASE_ITEM_TYPE_HEADER = 10000000;

    //底部开始的位置
    private static int BASE_ITEM_TYPE_FOOTER = 20000000;

    //数据列表的adpter不包含头部与底部
    private RecyclerView.Adapter mAdapter;


    public WrapRecyclerAdapter(RecyclerView.Adapter mAdapter) {
        this.mAdapter = mAdapter;
        mHeaderViews = new SparseArray<View>();
        mFooterViews = new SparseArray<View>();




    }

    /**
     *
     * @param parent
     * @param viewType  从getItemViewType获取
     * @return
     */

    @Override
    public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        //区分头部与底部和中间数据

        if (mHeaderViews.indexOfKey(viewType)>=0){

            //头部
            View headerView=mHeaderViews.get(viewType);

            return  createHeaderViewHolder(headerView);
        }else if (mFooterViews.indexOfKey(viewType)>=0){

            //底部

            View footerView=mFooterViews.get(viewType);

            return createFooterViewHolder(footerView);
        }else{

            //中间的数据列表

            return (CommonViewHolder) mAdapter.onCreateViewHolder(parent,viewType);

            //return  mAdapter.createViewHolder(parent,viewType);
        }




    }

    private CommonViewHolder createFooterViewHolder(View footerView) {
       /* return new RecyclerView.ViewHolder(footerView) {

        };*/
       return  new CommonViewHolder(footerView);
    }

    private CommonViewHolder createHeaderViewHolder(View headerView) {
       /* return new RecyclerView.ViewHolder(headerView) {
        };*/

       return new CommonViewHolder(headerView);
    }

    @Override
    public void onBindViewHolder(CommonViewHolder holder, int position) {
        int numHeaders = mHeaderViews.size();
        if (position < numHeaders) {
            //是头部不需要绑定数据
            return;
        }

        if (position>=(mHeaderViews.size()+mAdapter.getItemCount())){
            //此时为底部
            return;
        }


        // 返回列表Adapter的getItemViewType
        position = position - mHeaderViews.size();
        mAdapter.onBindViewHolder(holder, position);
      /* // int numFooters=

        //判断是否是中间的key
        final int adjPosition = position - numHeaders;
        int adapterCount = 0;
        if (mAdapter != null) {
            adapterCount = mAdapter.getItemCount();
            if (adjPosition < adapterCount) {

                mAdapter.bindViewHolder(holder,adjPosition);
            }
        }*/

        //底部
      //  return mFooterViews.keyAt(adjPosition - adapterCount);
    }

    @Override
    public int getItemCount() {
        return mHeaderViews.size()+mAdapter.getItemCount()+mFooterViews.size();
    }


    /**
     * 添加头部
     * @param view*/
    public void addHeaderView(View view) {
        if (mHeaderViews.indexOfValue(view)==-1){
            //判断是否已经添加了这个头部的View
            //如果存在就不要重复添加了
            mHeaderViews.put(BASE_ITEM_TYPE_HEADER++,view);

        }
        notifyDataSetChanged();
    }

    /**
     * 移除头部
     * @param view
     */

    public  void removeHeaderView(View view){
        if (mHeaderViews.indexOfValue(view)>=0){
            mHeaderViews.removeAt(mHeaderViews.indexOfValue(view));
        }
        notifyDataSetChanged();

    }

    /**
     * 加载底部
     * @param view
     */

    public void addFooterView(View view){
        if (mFooterViews.indexOfValue(view)==-1){
            //判断底部是否包含这个底部的View
            //如果包含就不要重复添加了
            mFooterViews.put(BASE_ITEM_TYPE_FOOTER++,view);
        }
        notifyDataSetChanged();

    }

    public  void removeFooterView(View view){
        if (mFooterViews.indexOfValue(view)>=0){
            mFooterViews.removeAt(mFooterViews.indexOfValue(view));
        }
        notifyDataSetChanged();

    }

    @Override
    public int getItemViewType(int position) {
        //根据当前位置,确定头部 底部 还是 列表


        //判断是否为头部

        int numHeaders = mHeaderViews.size();
        if (position < numHeaders) {
            return mHeaderViews.keyAt(position);//返回的是头部的key
        }

       /* if (position>=(mHeaderViews.size()+mAdapter.getItemCount())){
            //此时为底部
            // 直接返回position位置的key
            position = position - mHeaderViews.size() - mAdapter.getItemCount();
            return mFooterViews.keyAt(position);
        }*/

        //判断是否是中间的key
        final int adjPosition = position - numHeaders;
        int adapterCount = 0;
        if (mAdapter != null) {
            adapterCount = mAdapter.getItemCount();
            if (adjPosition < adapterCount) {
                return mAdapter.getItemViewType(adjPosition);
            }
        }

        //底部
        return mFooterViews.keyAt(adjPosition - adapterCount);
    }

    public void adjustSpanSize(RecyclerView recycler) {
        if (recycler.getLayoutManager() instanceof GridLayoutManager) {
            final GridLayoutManager layoutManager = (GridLayoutManager) recycler.getLayoutManager();
            layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    boolean isHeaderOrFooter =
                            isHeaderPosition(position) || isFooterPosition(position);
                    return isHeaderOrFooter ? layoutManager.getSpanCount() : 1;
                }
            });
        }
    }


    /**
     * 是不是底部位置
     */
    private boolean isFooterPosition(int position) {
        return position >= (mHeaderViews.size() + mAdapter.getItemCount());
    }

    /**
     * 是不是头部位置
     */
    private boolean isHeaderPosition(int position) {
        return position < mHeaderViews.size();
    }
}

应用:
   List<String> testList=new ArrayList<String>();
        for (int i = 0; i < 10; i++) {
            testList.add("item"+i);
        }

        adapter=new AllEBoardPreviewAdapter(testList);
         WrapRecyclerAdapter wrapRecyclerAdapter=new WrapRecyclerAdapter(adapter);
         rvEpreview.setAdapter(wrapRecyclerAdapter);
        wrapRecyclerAdapter.addHeaderView(LayoutInflater.from(AllEboradPreviewActivity.this).inflate(R.layout.test_header,null));
        wrapRecyclerAdapter.addFooterView(LayoutInflater.from(AllEboradPreviewActivity.this).inflate(R.layout.test_footer,null));

扩展:有时候需要添加删除数据,上面那个就不能使用了:因为我们只通知了数据源的那个adapter刷新,那个包装的那个adpter却没有通知跟新

package costomview.mycustomrecyclerview;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;


/**
 * Created by Administrator on 2017/4/19 0019.
 */

public class WrapRecyclerView extends RecyclerView {
   // private WrapRecyclerAdapter mAdapter;

    // 包裹了一层的头部底部Adapter
    private WrapRecyclerAdapter mWrapRecyclerAdapter;
    // 这个是列表数据的Adapter
    private RecyclerView.Adapter mAdapter;


    private AdapterDataObserver mAdapterDataObserver = new AdapterDataObserver() {
        @Override
        public void onChanged() {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyDataSetChanged没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyDataSetChanged();
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyDataSetChanged没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemRemoved(positionStart);
        }

        @Override
        public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyItemMoved没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemMoved(fromPosition, toPosition);
        }

        @Override
        public void onItemRangeChanged(int positionStart, int itemCount) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyItemChanged没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemChanged(positionStart);
        }

        @Override
        public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyItemChanged没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemChanged(positionStart,payload);
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            if (mAdapter == null) return;
            // 观察者  列表Adapter更新 包裹的也需要更新不然列表的notifyItemInserted没效果
            if (mWrapRecyclerAdapter != mAdapter)
                mWrapRecyclerAdapter.notifyItemInserted(positionStart);
        }
    };

    public WrapRecyclerView(Context context) {
        super(context);
    }

    public WrapRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

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


    @Override
    public void setAdapter(Adapter adapter) {
        // 为了防止多次设置Adapter
        if (mAdapter != null) {
            mAdapter.unregisterAdapterDataObserver(mAdapterDataObserver);
            mAdapter = null;
        }

        this.mAdapter = adapter;

        if (adapter instanceof WrapRecyclerAdapter) {
            mWrapRecyclerAdapter = (WrapRecyclerAdapter) adapter;
        } else {
            mWrapRecyclerAdapter = new WrapRecyclerAdapter(adapter);
        }

        super.setAdapter(mWrapRecyclerAdapter);

        // 注册一个观察者
        mAdapter.registerAdapterDataObserver(mAdapterDataObserver);

        // 解决GridLayout添加头部和底部也要占据一行
        mWrapRecyclerAdapter.adjustSpanSize(this);

    }


    /**
     * 添加头部
     *
     * @param view
     */
    public void addHeaderView(View view) {

        if (mWrapRecyclerAdapter != null) {
            mWrapRecyclerAdapter.addHeaderView(view);
        }
    }

    /**
     * 移除头部
     *
     * @param view
     */

    public void removeHeaderView(View view) {
        if (mWrapRecyclerAdapter != null) {
            mWrapRecyclerAdapter.removeHeaderView(view);
        }

    }

    /**
     * 加载底部
     *
     * @param view
     */

    public void addFooterView(View view) {
        if (mWrapRecyclerAdapter != null) {
            mWrapRecyclerAdapter.addFooterView(view);

        }

    }

    public void removeFooterView(View view) {
        if (mWrapRecyclerAdapter != null) {
            mWrapRecyclerAdapter.removeFooterView(view);
        }

    }
}


 rvEpreview.setLayoutManager(new LinearLayoutManager(this));



       // rvEpreview.setAdapter(adapter);


        List<String> testList=new ArrayList<String>();
        for (int i = 0; i < 10; i++) {
            testList.add("item"+i);
        }

        adapter=new AllEBoardPreviewAdapter(testList);
  

        rvEpreview.setAdapter(adapter);

        rvEpreview.addHeaderView(LayoutInflater.from(AllEboradPreviewActivity.this).inflate(R.layout.test_header,null));
        rvEpreview.addFooterView(LayoutInflater.from(AllEboradPreviewActivity.this).inflate(R.layout.test_footer,null));


        adapter.setListener(new AllEBoardPreviewAdapter.onItemClickListener() {
            @Override
            public void onItemClick(int position) {
                adapter.removeItem(position);
            }
        });

我的数据源adapter:
package eboardmodule.adapter;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import com.orhanobut.logger.Logger;
import com.wyt.hcy.aiyixue_teacher.R;

import org.w3c.dom.Text;

import adapter.CommonViewHolder;

/**
 * Created by hcy on 2017/4/14 0014.
 * func:
 */

public class AllEBoardPreviewAdapter extends RecyclerView.Adapter<CommonViewHolder> {

    private List<String> dataList;


    public AllEBoardPreviewAdapter(List<String> dataList) {

        //dataList=new ArrayList<String>();
        this.dataList = dataList;

    }

    private onItemClickListener listener;

    public void setListener(onItemClickListener listener) {
        this.listener = listener;
    }

    public void setDataSource(List<String> list) {

        this.dataList = list;

        notifyDataSetChanged();
    }

    public void removeItem(int pos){
        dataList.remove(pos);
        notifyDataSetChanged();
    }

    @Override
    public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.test1, parent,false);

      /*  return new RecyclerView.ViewHolder(itemView) {
        };*/

        return new CommonViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(CommonViewHolder holder, final int position) {
        //=holder.getView(R.id.tv);

       // TextView tv = (TextView) holder.itemView.findViewById(R.id.tv);

  /*      MyViewHolder myViewHolder= (MyViewHolder) holder;

        Logger.d("PPPP::"+position);

        myViewHolder.tv.setText(dataList.get(position));*/

        TextView tv=holder.getView(R.id.tv);
        tv.setText(dataList.get(position));

        LinearLayout item= holder.getView(R.id.item_test);

        item.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (listener!=null){
                    listener.onItemClick(position);
                }

            }
        });


    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    private class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView tv;

        public MyViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }

    public interface  onItemClickListener{
        void  onItemClick(int position);
    }


}

之前写的万能适配器里的ViewHolder

package adapter;

import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;


/**
 * Created by hcy on 2016/11/14.
 * func:Listview 通用的ViewHolder
 */

public class CommonViewHolder extends RecyclerView.ViewHolder {

    private final SparseArray<View> mViews;

    private View mConvertView;

    private int selectItem = -1;

    public void setSelectItem(int selectItem) {
        this.selectItem = selectItem;
    }

    public CommonViewHolder(View itemView) {
        super(itemView);
        mConvertView = itemView;
        this.mViews = new SparseArray<View>();
    }

    /**
     * 通过控件的Id获取对于的控件,如果没有则加入views
     *
     * @param viewId
     * @return
     */
    public <T extends View> T findViewById(int viewId) {

        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }


    //设置文本
    public void setText(int textViewID, String text, int visibility) {
        TextView textView = findViewById(textViewID);
        textView.setVisibility(visibility);
        textView.setText(text);
    }

    public void setTextBackground(int textViewID, int background) {
        TextView textView = findViewById(textViewID);
        textView.setBackgroundResource(background);
    }


    public void setImage(int imageviewId, int res) {
        ImageView imageView = findViewById(imageviewId);
        imageView.setImageResource(res);

    }


    public <T extends View> T  getView(int viewid) {

        return findViewById(viewid);

    }

}







RecyclerView中使用Filterable实现筛选数据 //实现Filterable接口 extends RecyclerView.Adapter<CompanyInfoAdapter.MyViewHolder> implements Filterable { getFilter实现过滤数据 public Filter getFilter() { return new Filter() { //... 阅读详情

相关推荐

Android Recycer 流式布局

Android开发之RecyclerView实现流式布局_安果移不动的博客-优快云博客 以前写过一篇 但是没有用到Kotlin。dataBinding。设置不可以点击等新技术。 这次重新来写一篇更加完善。 效果图 adapter布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" .

丿灬安之若死 733

Android RecycleView 分类和折叠显示

在使用recycleview的时候,外层最好是不要有scrollview,或者说是不能,不然会发生冲突。仔细想想recycleview的wrap_content 并不代表着根据内容自适应高度,它的高度应和屏幕高度保持一致,然后才能去重复利用view,所以你把recycleview撑开了的话,再使用scrollview去滚动,就失去了本身的意义。所以,实现一定是用1个recycleview去包裹住所

nightwizard2030的博客 5409

Android-一个随机显示RecycylerViewItem附带animation效果

一个随机显示RecycylerView Item, 附带animation效果

Android跳转小项目-CHANGE页面-Recycylerview、List、Context(二)

页面二 页面需求 需要在change页面中出现两列内容,左边列为1-30,在数字后跟删除按钮;右边为31-60,数字后为删除按钮,在点击某一边的删除按钮后,对应的数组会跳转到另一列中。 流程说明 首先,需要创建change_page.xml页面,在页面中使用线性布局,添加两个RecyclerView,然后再单独创建item_demo.xml为RecyclerView中的item设置样式。 接下来创建适配器RecycleAdapterDemo.java ① 创建一个继承RecyclerView.Adapte

受折磨的邱丘丘 2365

RecyView刷新加载

封装RecyclerView+SwipeRefreshLayout ,下拉刷新,上拉加载例子。

Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)

RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,下面这篇文章主要给大家介绍了Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)的相关资料,文中介绍的非常详细,需要的朋友可以参考下。

RecycleView实现查看全部,折叠效果

首先先看图示效果 这个是收起的一个效果 这是展示全部的一个效果 代码实现 第一步 题目已经指出,咱用的是recycle 所以就要创建一个recycleview recyc.xml <android.support.v7.widget.RecyclerView android:id="@+id/recycle" android:backgroun...

技术大白的博客 1394

Android中RecyclerView实现多级折叠列表效果(二)

主要给大家介绍了Android中RecyclerView实现多级折叠列表的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

Android RecyclerView点击展开、折叠效果的实现方式

实现效果 思路 我使用的是第三方适配器BaseRecyclerViewAdapterHelper 但是遇到一个问题 这个适配器2.0和3.0不兼容 而2.0版本 没有折叠效果这个组件 我用3.0版本 gradle一直依赖不了 怎么办? 只能寻找其他方法来实现 我想到的是在用两层 RecyclerView的办法 在第一次的item布局里嵌套第二次RecyclerView 觉得可行 就开始写代码 最终结果还可以优化 就是上面的样子 实现了点击折叠和展开的效果 代码 代码实现比较简单 唯一要说的就是通过一个

吕氏春秋i 3464

AI与运筹学赋能:混合动力公交调度优化算法实战解析

组合优化是运筹学与计算机科学交叉的核心领域,旨在从海量可行方案中寻找最优解,其原理在于通过定义目标函数与约束条件,将复杂现实问题转化为可计算的数学模型。该技术的核心价值在于解决资源受限下的高效分配问题,广泛应用于物流、交通、生产调度等场景。在智慧交通领域,混合动力公交车辆调度正是一个典型的组合优化问题,涉及车辆、班次、充电桩等多重资源与时空约束。本文聚焦于通过贪婪启发式与模拟退火元启发式算法,求解大规模公交网络下的车辆调度与能耗优化方案,旨在实现总能源成本最小化。其中,模拟退火算法通过引入概率性接受劣解的策

weixin_42497762的博客 406

拆解英飞凌CoolGaN:如何用Silvaco TCAD仿真评估功率GaN HEMT的关键性能(BV、Qg、开关损耗)

本文详细解析了如何使用Silvaco TCAD仿真工具评估英飞凌CoolGaN功率GaN HEMT的关键性能指标,包括击穿电压(BV)、栅电荷(Qg)和开关损耗。通过精确建模极化效应、优化边缘终端结构以及高频开关损耗仿真技术,为功率器件工程师提供了一套完整的'设计-仿真-验证'方法论,助力GaN HEMT在快充、数据中心电源等领域的应用。

weixin_29159995的博客 426

Android 卡片层叠效果

卡片层叠效果的实现:比如探探上的左滑右滑切换图片。 而现在我们要实现的卡片层叠以及滑动删除是通过RecyclerView的ItemTouchHelper工具来实现的,ItemTouchHelper这个工具是对RecyclerView列表的拖动排序和滑动删除进行了处理。ItemTouchHelper是继承了RecyclerView.ItemDecoration,我们可以发现ItemTouchHel

Gorky_19的博客 4336

反激电源反馈环路设计:从TL431+PC817原理到动态补偿实战

本文深入解析了反激电源中由TL431和PC817构成的经典反馈环路设计。从静态工作点计算到动态补偿实战,详细阐述了如何通过Type II补偿网络优化环路稳定性与动态响应,并分享了应对光耦CTR离散性、布局噪声等常见调试难题的实用技巧,帮助工程师设计出高性能、高可靠的开关电源。

moon9的博客 698

RecycleView中使用ExpandView实现折叠效果

效果图:  最近实现业务:点击了解更多加载商品,再点折叠上去,实现方法:item中嵌套expandView 上代码: &lt;com.xxxx.xxx.widget.ExpandView android:id="@+id/expandView" android:layout_width="match_parent" android:layout_height="wr...

点滴之路的博客 2993

大模型LoRA微调调参的实战技巧(持续更新)

本文主要介绍了大模型LoRA微调调参的实战技巧,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战技巧

herosunly的博客 20万+

【知识点讲解】大模型参数量与计算量(FLOPs)估算方法

指标参数量 (Params)计算量 (FLOPs)含义模型的大小,静态模型的计算复杂度,动态决定因素模型结构(宽度、深度)模型结构 +输入数据(B, S)影响内存占用、磁盘空间运行速度、能耗单位M (百万), B (十亿)工具thopptflopstorchinfothopptflopsfvcore重要提示FLOPs ≠ 速度:FLOPs 是理论计算量。实际速度还受内存带宽 (Memory Bandwidth)并行度硬件架构等因素严重影响。

AI浩 2095

android关键词过滤,recyclerview搜索关键字过滤列表内容

当Recyclerview绑定了一大段数据的时候、但我们有时候想要快速找到某一个item,这时候通过搜索关键字就能够快速找到相应的item了。recyclerview 绑定数据到适配器adapter初始化相关对象adapter = new InviteMessageAdapter(this);recyclerView.setItemAnimator(new DefaultItemAnimator(...

weixin_42355294的博客 654

基于STM32L4XX、HAL库的MAX13487EESA RS485总线收发器驱动程序设计

MAX13487EESA是一款3.3V供电的RS-485/RS-422收发器,由Maxim Integrated生产。PA4 (控制引脚) ---> /RE, DE (连接在一起)具有±15kV ESD保护的驱动器输出和接收器输入。半双工RS-485/RS-422通信。工业温度范围:-40°C至+85°C。工作电压范围:3.0V至3.6V。数据速率高达250kbps。

zhusl6688的博客 685

RecyclerView超详总结

登录后复制i < 1000;i++) {Recycler_item p1 = new Recycler_item(R.drawable.p1,"风景1");Recycler_item p2 = new Recycler_item(R.drawable.p2,"风景2");Recycler_item p3 = new Recycler_item(R.drawable.p3,"风景3");Recycler_item p4 = new Recycler_item(R.drawable.p4,"风景4")

cnzzs的博客 1050

9篇6章7节:SEER 数据库的2025年数据变量多条件组合选择(2026年版)

软件中的病例筛选功能通过CaseSelection界面实现精准研究队列构建。该界面允许用户通过变量选择(Variable)、运算符定义(Operator)和取值设定(Values)三步操作创建筛选条件,支持种族、分期等关键变量的多条件组合。

MD Code 1454

华为OD机试 - 战士技能规划设计 - 数组(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。你为一款动作游戏设计战士角色的技能:战士每个技能会消耗不同能量,释放技能有 2 个约束:连续释放技能数量不能超过 m 个,技能能量总和不能超过能量上限 k;如果超过则必须中断当前技能,进入调息状态(即分段)。战士有一项爆发技巧:在单次战斗中有一次

学Java,找哪吒 225

RecyclerView有数据但没有显示(多种情况都有分析)

layout_height使用了wrap_content,应该改成match_parent。7.Android RecyclerView 相互嵌套内层RecyclerView显示不全的问题,解决方案请看。

UrasakiNakajima的博客 4902

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android本地实现已读未读功能

实现方式:

yhy123456q的博客 5709

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android RecyclerView之最基本使用教程完整示例(列表/分隔线/点击事件响应/水波纹特效等实现)

代码中全部都有注释,且很多地方都有多种实现方法。从IDE中我们可以看到,Listview控件已经被谷歌边缘化了。存放在Legacy分类下,legacy在英语中就是过期,遗产的意思。前面几篇文章我们学了Listview的一些基本使用和面向实用优化性的一些进阶自定义用法。这篇文章开始学习RecyclerView,还是先从一个最简单的示例开始。本篇文章我们将用RecyclerView实现如下效果图(实现一个带分隔线有点击事件的列表,类似Listview ArrayAdapter的示例)MyAdapter适配器。

wh445306 4250

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android基础——RecyclerView

RecycleViewRecycleView是什么?RecycleView使用三级目录 RecycleView是什么? RecycleView是进阶版的ListView,不仅可以实现ListView的纵向滑动,还可以横向滑动和瀑布流滑动。 RecycleView使用 使用RecycleView需要在build.gradle中添加相应的依赖库 三级目录 ...

松仔Log的博客 1万+

RecyclerView过滤item 配合SerchView

SearchView searchView = findViewById(R.id.searchView); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; ...

csdn546229768的博客 328
上一篇: android 积累okhttp3与retrofit2常见的使用方法
下一篇: android 积累一点关于fragment的知识
泡温泉的咸鱼
博客等级 码龄11年 39粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值