RecyclerView笔记

2016-08-16  本文已影响0人  qianxL

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



RecyclerView##

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
上一篇 下一篇

猜你喜欢

热点阅读