美文网首页
RecyclerView笔记

RecyclerView笔记

作者: qianxL | 来源:发表于2016-08-16 17:53 被阅读0次

    layout: post
    title: "新控件笔记"
    date: 2016-08-16 12:16:58 +0800
    comments: true
    categories:



    RecyclerView##

    • 此控件还需要在app的gradle中添加依赖才能使用
    • RecyclerView 控件是用来替换ListView的,此控件并不会像ListView默认加分割线,而且并没有setOnItemClickListener()方法。
    • RecyclerView控件主要由这几部分构成
      • LinearLayoutManager:主要用于制Recyclerview的子项之间的放置方式。

          layoutManager = new                       LinearLayoutManager(context);
          layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
          mRecycler.setLayoutManager(layoutManager);
        
      • 自定义适配器类,继承RecyclerView.Adapter<MHolder> ,泛型放入的为子项布局view的持有对象类。

          public HomeAdapter(Context context,List<String> list){
          this.context = context;
          this.dataList = list;
          }
        
          @Override
          public HomeHolder  onCreateViewHolder(ViewGroup parent, int viewType) {
             View view = LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1,parent,false);
          view.setOnClickListener(this); //此为注册子项布局View的点击监听者。
          return new HomeHolder(view);
          } //此方法用于创建子项布局View持有者对象。
        
          @Override
          public void  onBindViewHolder(HomeHolder holder, int position) {
          String content =  dataList.get(position);
          holder.setTextView(content);
          holder.itemView.setTag(content);  //用于封存子View 对应的实体类对象。
          } //此方法呢在RececlerView绘制子项布局View 时就会回调到,所以其中的主要逻辑用于设置View 内容。
        
          @Override
          public int getItemCount() {
              return dataList.size();
          }  //此方法用于表示RececlerView显示多少个子项布局内容。所以一般返回存放实体类的List容器.size()就能显示全部了。
        
      • 自定义View持有类,继承于RecyclerView.ViewHolder,用于持有子项布局View对象,提高RececlerView的效率。

    Insert Your Code Here.
    ``` private TextView textView;
        public HomeHolder(View itemView) {
            super(itemView);
            textView =(TextView) itemView.findViewById(android.R.id.text1);
        } //构造函数用于获取子项布局下的UI控件
        public void setTextView(String text){
            textView.setText(text);
        }
        
        + 子项布局用于RecyclerView的单项UI。
        + List容器用于放置实体类。实体类单项UI的资源对象。当List容器里的对象数发生改变了,只需调用mAdapter.mAdapter.notifyDataSetChanged(),新的内容就能绘制到屏幕上了。
    
    + 当要在RececlerView中实现多Item布局时呢,就需要注意使用onCreateViewHolder(ViewGroup parent,int viewType)的第二参数,可以根据ViewType来决定创建哪个ViewHolder。用getItemViewType()设置什么条件(位置)下返回 哪个值并传给ViewType。然后到onBindViewHolder( )方法下去对当前的holder实例进行判断。getItemViewType(int position)方法表示position值的子项视图是什么。getItemViewType()方法会当有子项视图绘制时是都会被调用,如返回的是一个新值(返回到ViewType中,跟之前对比不同),就会去回调onCreateViewHolder( )方法创建新的ViewHolder对象。
    
    
          //列表元素private static final int TYPE_ITEM = 0;
          //脚布局private static final int TYPE_FOOTER = 1;  
          @Override
          public RecyclerView.ViewHolder  onCreateViewHolder(ViewGroup parent, int viewType) {
            if (viewType == TYPE_ITEM) {
                View root = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.layout_news_item, parent, false);
                return new ItemViewHolder(root);
            } else {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.layout_listview_footer, null);
                view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT));
                return new FooterViewHolder(view);
            }
          }
    
          @Override
          public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            if (holder instanceof TextViewHolder) {
                ((TextViewHolder) holder).mTextView.setText(mTitles[position]);
            } else if (holder instanceof ImageViewHolder) {
                ((ImageViewHolder) holder).mTextView.setText(mTitles[position]);
            }
          }
          @Override
          public int getItemViewType(int position) {
            return position > 50 ?  TYPE_ITEM:TYPE_FOOTER;         
          }
    + 当子项布局的高度是固定时,调用此 mRecycler.setHasFixedSize(true); 可提高性能。
    
    + 因Recycler默认子项布局之间没有分割线,所以这条分割线就需要,在编写子项布局xml文件时加入。
    如子项布局之间的排放是垂直的话,分割线以横线的形式放置,如子项布局之间的排放是水平的话,分割线以竖线的形式放置。
    
    + 因Recycler默认没有每个项目的点击事件接口。所以需要到Adapter中添加,不能直接在Recycler中的onClick中加入,会破化代码的逻辑。
        + 在适配器类的中onCreatViewHolder()中为每个子项View注册setOnClickListener(),并在Onclik()中回调公开ItemClick接口,并把子项布局的实体类传给调用者,调用者在实体类写自己的逻辑
                
                 @Overridepublic void onBindViewHolder(HomeHolder holder, int position) {   
                 String content = dataList.get(position);
                 holder.setTextView(content);            
                 holder.itemView.setTag(content); //把item对应的实体类传给itemView,方便点击事件发生时得到对应的资源。
               }
    
                public static interface  OnRecyclerViewItemClick{
                    void OnItemClick(View v,String data);
                }  
                @Override
                public void onClick(View view) {
                if(mOnItemClick != null){
                mOnItemClick.OnItemClick(view,(String) view.getTag());
                    }
                }
    
                public void             setOnItemClickListener(OnRecyclerViewItemClick listener){
                    mOnItemClick = listener;
                }//外部接口。
        
    ### SwipeRefreshLayout
       + 这是一个刷新布局控件,意为此布局下的控件当有下拉滑动动作时,就能产生刷新事件。
                mRefreshl.setOnRefreshListener(this);
                @Override
                public void onRefresh() {
                if(LEVE_L == 0 ){
                queryProvince();
                }else if(LEVE_L == 1){
                queryCounty(false);
                }
                mRefreshl.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if(LEVE_L == 0 )
                    Toast.makeText(context, "刷新市级列表成功", Toast.LENGTH_SHORT).show();
                    else
                        Toast.makeText(context, "刷新县级列表成功", Toast.LENGTH_SHORT).show();
                    mRefreshl.setRefreshing(false);
                }
               },3000); //此控件呢在变为刷新状态后一定要取消。
              }
        
    postDelayed()方法,接收两个参数,第一参数为毫秒时间到执行的任务(默认主线程执行),第二参数为延时的时间。
    + mRefre.setColorSchemeResources( );此接口用于设置旋转条的颜色。可传入一组颜色的id

    相关文章

      网友评论

          本文标题:RecyclerView笔记

          本文链接:https://www.haomeiwen.com/subject/vqipsttx.html