Android RecyclerView完全解析

有段时间没写博客了,可能写博客的时间都用去把妹了吧。说到把妹,偶尔也会在无意间了解一些把妹的技巧,比如云擒故纵啊什么的。可能这些技巧前期会有一定的作用,可能会让妹子对你产生一定的好感或者依赖性。但是话说回来时间长了,还是得靠真本事来挽留住妹子的心。比如自身的素养,自身的经济实力,自身是不是真心对身边的每一个人,而不是只是使用一些临时学来的小伎俩。只是靠一些套路,不仅时间长了,妹子走了。最真诚的朋友也会慢慢离你而去。我身边其实有这样的例子。所以说谈恋爱、工作、生活,其实都是密不可分的。谈恋爱的时候是个什么样的人,大体可以推断出工作中、生活中是个什么样的人了。所以作为一个IT男,可能在恋爱方面不那么有优势,但是我们可以在努力高效率的工作之后,尽情的享受生活带给我们的乐趣,比如去运动运动,爬爬山,游游泳,旅旅行。真诚的对待身边的人 ,那么就会慢慢变成一个阳光开朗有责任的人。那么妹子自然会被你吸引到。人们不是说最高端的把妹手段不是追求,而是吸引。当然,可能有的人可能会说,说的好轻松,整天加班哪有时间呀。但据我所知啊。我们这个行业加班的情况大体有两种:一种是真的很忙,尤其是项目后期,那么这个时候该干什么干什么吧。好好工作,工作的时候学到了很多东西。很值得的,过完这阵还是可以放松放松的。还有一种就是不知道为什么加班,无谓的那种加班,没什么效率,基本上就是耗时间,那么这种情况下,就要考虑换一换了。人生很短,来不及等待。努力的同时,希望我们能够生活的更精彩。因为青春转眼即逝~~


好了,以上只是最近的一些小感慨,突然有感觉了,就写了下来,每时每刻都在体验中,希望大家工作的业余时间有兴趣可以一起交流下。


言归正传,RecyclerView出来很长时间了。最近才真正的运用上,平时就是懒,思路比较懈怠,可能是从小的一个缺点吧。比较传统,有能用的ListView、GridView就行了。但是真正用到RecyclerView才发现它是如此的强大,如此的方便。所以最近写了较多RecyclerView的例子,以便来更透彻的来学习它。

下面贴出来RecyclerView使用最基础的代码:

package com.hongri.recyclerview.activity;

import android.os.Bundle;

import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.ndk.CrashlyticsNdk;
import com.hongri.recyclerview.R;
import com.hongri.recyclerview.fragment.HomeFragment;
import com.hongri.recyclerview.utils.Logger;

import io.fabric.sdk.android.Fabric;
/**
 * @author:zhongyao on 2016/6/30 14:32
 * @description:主界面Activity
 */
public class MainActivity extends BaseActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Logger.d("MainActivity--onCreate()");
        //Fabric统计初始化
        Fabric.with(this, new Crashlytics(), new CrashlyticsNdk());

        setContentView(R.layout.activity_main);

        getSupportActionBar().setTitle("红日");
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, HomeFragment.getInstance()).commit();
        }

    }
}
package com.hongri.recyclerview.fragment;

import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.hongri.recyclerview.R;
import com.hongri.recyclerview.activity.DetailActivity;
import com.hongri.recyclerview.adapter.HomeViewAdapter;
import com.hongri.recyclerview.utils.DataUtil;
import com.hongri.recyclerview.utils.Logger;
import com.hongri.recyclerview.utils.ToastUtil;

import java.util.ArrayList;

/**
 * @author:zhongyao on 2016/6/29 15:52
 * @description:
 */
public class HomeFragment extends Fragment implements HomeViewAdapter.HomeViewItemClickListener{
    private RecyclerView mRecyclerView;
    private HomeViewAdapter mAdapter;
    private static HomeFragment homeFragment = null;
    private ArrayList<String> mData = new ArrayList<>();


    /**
     * 单例模式--双重检查锁定
     * @return
     */
    public static HomeFragment getInstance(){
        if (homeFragment == null){
            synchronized (HomeFragment.class){
                if (homeFragment == null){
                    homeFragment = new HomeFragment();
                }
            }
        }
        return homeFragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Logger.d("HomeFragment--oncreate()");
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Logger.d("HomeFragment--onCreateView()");
        View view = inflater.inflate(R.layout.fragment_home,container,false);
        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Logger.d("HomeFragment--onViewCreated()");

        init(view);

        //获取数据
        mData = DataUtil.getHomeData();
    }

    private void init(View view) {
        mRecyclerView = (RecyclerView) view.findViewById(R.id.rv);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Logger.d("HomeFragment--onActivityCreated()");

        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
//        if (APPUtils.isLandscape(getActivity())){
//            mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(),8));
//        }else{
//            mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(),4));
//        }
        mAdapter = new HomeViewAdapter(getActivity(),mData);
        mAdapter.setItemClickListener(this);
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    }

    @Override
    public void onItemClick(View v,int position) {

        ToastUtil.ShowBottomShort(getActivity(),mData.get(position));

        Intent intent = new Intent(getActivity(),DetailActivity.class);
        intent.putExtra("position",position);
        intent.putExtra("title",mData.get(position));
        startActivity(intent);

    }

    @Override
    public void onItemLongClick(View view, int position) {
        ToastUtil.ShowBottomShort(getActivity(),"longClick:"+mData.get(position));
    }

}

最基础的代码,相信都能看懂:

LinearLayoutManger、GridLayoutManger、StaggeredGridLayoutManager本别可以看做ListView、GridView、瀑布流的管理器,用来实现这三种布局结构。

package com.hongri.recyclerview.adapter;

import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.hongri.recyclerview.R;
import com.hongri.recyclerview.utils.Logger;

import java.util.ArrayList;

/**
 * @author:zhongyao on 2016/6/29 17:34
 * @description:HomeFragment--RecyclerView适配器
 */
public class HomeViewAdapter extends RecyclerView.Adapter<HomeViewAdapter.HomeViewHolder> {

    private Context context;
    private  ArrayList<String> mData;
    private HomeViewItemClickListener mItemClickListener;
    private LayoutInflater mLayoutInflater;
    public HomeViewAdapter(Context context, ArrayList<String> mData){
        this.context = context;
        this.mData = mData;
        this.mLayoutInflater = LayoutInflater.from(context);
        Logger.d("HomeViewAdapter");
    }

    public void setItemClickListener(HomeViewItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }

    @Override
    public HomeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Logger.d("HomeViewAdapter--onCreateViewHolder()");
        View view = this.mLayoutInflater.inflate(R.layout.home_recyclerview_item,parent,false);
        HomeViewHolder holder = new HomeViewHolder(view,this.mItemClickListener);
        return holder;
    }

    @Override
    public void onBindViewHolder(HomeViewHolder holder, int position) {
        Logger.d("HomeViewAdapter--onBindViewHolder()");

        holder.tv.setText(mData.get(position));
    }

    @Override
    public int getItemCount() {
        Logger.d("HomeViewAdapter--getItemCount()");
        return mData.size();
    }

    public class HomeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{
        HomeViewItemClickListener mItemClickListener;
        CardView cv_item;
        TextView tv;
        public HomeViewHolder(View itemView ,HomeViewItemClickListener mItemClickListener) {
            super(itemView);
            this.mItemClickListener = mItemClickListener;
            Logger.d("HomeViewAdapter--HomeViewHolder");

            cv_item = (CardView) itemView.findViewById(R.id.cv_item);
            tv = (TextView) itemView.findViewById(R.id.tv);

            cv_item.setOnClickListener(this);
            cv_item.setOnLongClickListener(this);
        }

        @Override
        public void onClick(View v) {
            Logger.d("onClick()");
            if (mItemClickListener != null){
                mItemClickListener.onItemClick(v,getAdapterPosition());
            }
        }

        /**
         * 返回值为true时:长按时只调用onLongClick;
         * 返回值为false时:长按时先调用onLongClick,然后调用onClick。
         * @param v
         * @return
         */
        @Override
        public boolean onLongClick(View v) {
            Logger.d("onLongClick()");
            if (mItemClickListener != null){
                mItemClickListener.onItemLongClick(v,getAdapterPosition());
            }
            return true;
        }
    }

    public interface HomeViewItemClickListener{
        void onItemClick(View view,int position);
        void onItemLongClick(View view,int position);
    }
}

以上是RecyclerView的适配器,需要继承RecyclerView.Adapter:

RecyclerView.ViewHolder是默认自带的ViewHolder,所以不用像之前的ListView那样自己写ViewHolder了。

扫描二维码关注公众号,回复: 9612045 查看本文章

onCreateViewHolder用于加载item布局,并将其与Holder关联上,用于复用布局控件。

OnBindViewHolder用于展示数据。

RecyclerView没有像ListView中的setOnItemClickListener等的item点击监听事件,感觉这也是为了使RecyclerView更具灵活性吧,Google工程师其实就是将RecyclerView定义为一种容器,给开发者更大的发挥空间。这里其实就是写的item的一个监听回调事件,用过回调的,看起来就很容易了。

实现效果图:


以上只是一种类ListView实现方式主要代码,下面给出我最近一直在写的Demo,里面包含各种实现方式,GridView、瀑布流,还包含混合式布局的加载等都有所介绍。而且这个demo我也会持续更新,发现什么好玩的都希望写进去。也希望大家多多交流,一起进步。

该Demo的github地址:AndroidRecyclerView


发布了95 篇原创文章 · 获赞 195 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/u012440207/article/details/52085961
今日推荐