RecyclerView 的使用

RecyclerView在android5.0之后被引进,可以通过导入support-v7对其进行使用。 
据官方的介绍,该控件用于在有限的窗口中展示大量数据集。提供了一种插拔式的体验,高度的解耦,异常的灵活,
通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
你想要控制其显示的方式,请通过布局管理器LayoutManager
你想要控制Item间的间隔(可绘制),请通过ItemDecoration
你想要控制Item增删的动画,请通过ItemAnimator

你想要控制点击、长按事件,请自己写

1 .RecyclerView的基本展示 
public class RecycleerActivity01 extends AppCompatActivity {
    private RecyclerView recyclerView;
    private List<String> mdatas;
    private BasicAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycleer01);
        recyclerView = (RecyclerView) findViewById(R.id.id_rv);
        //数据源
        initData();
        //想recycleView中添加数据,使用适配器
        adapter = new BasicAdapter(mdatas, this);
        recyclerView.setAdapter(adapter);
        //声明布局管理器,设置RecycleView最终展示的效果,最后一个参数是是否反转数据
        LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        //设置增加条目的动画
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        adapter.setOnItemClickListener(new BasicAdapter.OnItemClickListener1() {
            @Override
            public void onItemClick(View itemView, int position) {
                Toast.makeText(RecycleerActivity01.this, "你点击了" + mdatas.get(position), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongItemClick(View itemView, int position) {
                Toast.makeText(RecycleerActivity01.this, "你长按点击了" + mdatas.get(position), Toast.LENGTH_SHORT).show();
            }
        });

    }

    private void initData() {
        mdatas = new ArrayList<>();
        for (int i = 0; i < 48; i++) {

            mdatas.add("第" + i + "条数据");

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.add:
                adapter.addData(1);
                break;
            case R.id.delete:
                adapter.removeData(1);
            case R.id.diplay_lv:
                LinearLayoutManager manget = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
                recyclerView.setLayoutManager(manget);
                break;
            case R.id.diplay_gv:
                GridLayoutManager manage = new GridLayoutManager(this, 3);
                recyclerView.setLayoutManager(manage);
                break;
            case R.id.diplay_hlv:
                StaggeredGridLayoutManager ma = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL);
                recyclerView.setLayoutManager(ma);
                break;
            case R.id.diplay_hgv:
                StaggeredGridLayoutManager mm = new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.HORIZONTAL);
                recyclerView.setLayoutManager(mm);
                break;

            case R.id.diplay_staggered:
                Intent intent = new Intent(this, StaggeredActivity.class);

                startActivity(intent);

                break;


        }


        return super.onOptionsItemSelected(item);
    }
 

public class BasicAdapter extends RecyclerView.Adapter<BasicAdapter.BasicViewHolder> {

    private List<String> mdatas;
    private Context context;
    private OnItemClickListener1 listener;//使用RecyclerView,你想要控制点击、长按事件,需要自写

    public BasicAdapter(List<String> mdatas, Context context) {
        this.mdatas = mdatas;
        this.context = context;
    }

    public void setOnItemClickListener(OnItemClickListener1 listener) {
        this.listener = listener;
    }

    public interface OnItemClickListener1 {
        public void onItemClick(View itemView, int position);

        public void onLongItemClick(View itemView, int position);
    }

    //创建一个viewholder 并且返回出去
    @Override
    public BasicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context).inflate(R.layout.item_recycle01, parent, false);
        BasicViewHolder holder = new BasicViewHolder(itemView);

        return holder;
    }

    //绑定viewholder 在这个方法中,完成赋值操作
    @Override
    public void onBindViewHolder(BasicViewHolder holder, int position) {
        holder.tv.setText(mdatas.get(position));
        setUpEvent(holder);
    }

    protected void setUpEvent(final BasicViewHolder holder) {
        if (listener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        int pos = holder.getLayoutPosition();
                        listener.onItemClick(holder.itemView, pos);
                    }
            });

            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int position = holder.getLayoutPosition();
                    listener.onLongItemClick(holder.itemView, position);
                    return false;
                }
            });
        }
    }

    public void addData(int pos) {
        mdatas.add(pos, "insert one");
        notifyItemChanged(pos);
    }

    public void removeData(int pos) {
        mdatas.remove(pos);
        notifyItemRemoved(pos);
    }


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

    class BasicViewHolder extends RecyclerView.ViewHolder {
        TextView tv;

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

}

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/add"
        android:icon="@android:drawable/ic_menu_add"
        android:orderInCategory="100"
        android:title="add"
        app:showAsAction="always"></item>
    <item
        android:id="@+id/delete"
        android:icon="@android:drawable/ic_menu_delete"
        android:orderInCategory="100"
        android:title="remove"
        app:showAsAction="always"></item>
    <item
        android:id="@+id/comment"
        android:orderInCategory="100"
        android:title="展示类型"
        app:showAsAction="always">
        <menu>
            <item
                android:id="@+id/diplay_lv"
                android:orderInCategory="100"
                android:title="just like ListView"></item>
            <item
                android:id="@+id/diplay_gv"
                android:orderInCategory="100"
                android:title="just like GridView"></item>
            <item
                android:id="@+id/diplay_hlv"
                android:orderInCategory="100"
                android:title="Horizontal ListView"></item>
            <item
                android:id="@+id/diplay_hgv"
                android:orderInCategory="100"
                android:title="Horizontal GridView"></item>
            <item
                android:id="@+id/diplay_staggered"
                android:orderInCategory="100"
                android:title="Staggered View"></item>
        </menu>
    </item>
</menu>

 <android.support.v7.widget.RecyclerView

        android:id="@+id/id_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>

2.RecyclerView的切换展示
public class RecycleerActivity02 extends AppCompatActivity {
    private String url = "http://appsrv.flyxer.com/api/digest/recomm/dests?page=1";
    private RecyclerView recyclerView;
    private listAdapter adapter;
    private GridAdapter gridAdapter;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycleer01);
        recyclerView = (RecyclerView) findViewById(R.id.id_rv);
        context = this;
        loadData(url);

    }

    private void loadData(String url) {
        RequestParams params = new RequestParams(url);
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                List<ParseRootData.RootData> rootbean = ParseRootData.parseData(result);
                adapter = new listAdapter(context, rootbean);
                gridAdapter = new GridAdapter(context, rootbean);
                recyclerView.setAdapter(adapter);
                LinearLayoutManager manager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
                recyclerView.setLayoutManager(manager);

            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.country, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.list:

                recyclerView.setAdapter(adapter);
                LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
                recyclerView.setLayoutManager(manager);
                break;


            case R.id.grid:

                recyclerView.setAdapter(gridAdapter);
                GridLayoutManager man = new GridLayoutManager(this, 2);
                recyclerView.setLayoutManager(man);


                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

3 .RecyclerView的照片墙展示 瀑布流,高度不同
public class RecycleerActivity03 extends AppCompatActivity {
    private RecyclerView recyclerView;
    private PhotoWallAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycleer01);
        recyclerView = (RecyclerView) findViewById(R.id.id_rv);

        adapter = new PhotoWallAdapter(RecycleerActivity03.this);

        recyclerView.setAdapter(adapter);

        StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);

        recyclerView.setLayoutManager(manager);

    }
}

public class PhotoWallAdapter extends RecyclerView.Adapter<PhotoWallAdapter.PhotoViewHolder> {
    private Context context;
    private List<Integer> mHeight;
    private String imgUrls[];

    public PhotoWallAdapter(Context context) {
        this.context = context;
        imgUrls = ImageUrls.imageurls;
        mHeight = new ArrayList<>();
        for (int i = 0; i < imgUrls.length; i++) {
            mHeight.add((int)(300+Math.random()*400));
        }
    }


    @Override
    public PhotoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context).inflate(R.layout.item_stagger,parent,false);
        PhotoViewHolder holder = new PhotoViewHolder(itemView);
        return holder;
    }

    @Override
    public void onBindViewHolder(PhotoViewHolder holder, int position) {

        ViewGroup.LayoutParams lp = holder.iv.getLayoutParams();
        lp.height = mHeight.get(position);
        holder.iv.setLayoutParams(lp);

        ImageOptions options = new ImageOptions.Builder().setFailureDrawableId(R.mipmap.ic_launcher)
                .setLoadingDrawableId(R.mipmap.ic_launcher).build();
        x.image().bind(holder.iv,imgUrls[position],options);
    }

    @Override
    public int getItemCount() {
        return imgUrls.length;
    }

    class PhotoViewHolder extends RecyclerView.ViewHolder{
        ImageView iv;
        public PhotoViewHolder(View itemView) {
            super(itemView);
            iv = (ImageView)itemView.findViewById(R.id.id_iv);
        }
    }

}


4.RecyclerView的本地数据分页加载 含下拉刷新和上拉加载
public class RecycleerActivity04 extends AppCompatActivity {
    private RecyclerView recyclerView;
    private SwipeRefreshLayout swipeRefreshLayout;
    private List<Map<String, String>> datas;
    private LinearLayoutManager manager;
    private RecyclerAdapter4 adapter;
    private boolean isLoading = false;//判断是否处于上拉加载的状态
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycleer04);
        initView();
        setEvent();
    }


    private void initView() {

        recyclerView = (RecyclerView) findViewById(R.id.id_rv);
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.sr1);
        swipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN);
        manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(manager);
        datas = new ArrayList<>();
        getData();
        adapter = new RecyclerAdapter4(this, datas);
        recyclerView.setAdapter(adapter);

    }

    private void setEvent() {
        //设置下拉刷新的操作
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        datas.clear();
                        getData();
                        adapter.notifyDataSetChanged();
                        swipeRefreshLayout.setRefreshing(false);
                    }
                }, 3000);
            }
        });//设置上拉加载的监听器
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //获得可见条目的最后一条位置
                int lastVisibleItemPosition = manager.findLastVisibleItemPosition();
                if (lastVisibleItemPosition + 1 == adapter.getItemCount()) {
                    boolean isRefresh = swipeRefreshLayout.isRefreshing();
                    if (isRefresh) {
                        return;
                    }
                    if (!isLoading) {
                        isLoading = true;
                        //没有处于加载状态,需要加载数据,就可以进行分页加载
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                getData();
                                adapter.notifyDataSetChanged();
                                adapter.notifyItemRemoved(adapter.getItemCount());
                                isLoading = false;
                            }
                        }, 4000);


                    }

                }
            }
        });

    }

    private void getData() {

        int size = datas.size();
        for (int i = 0; i < 20; i++) {
            Map<String, String> map = new HashMap<>();
            map.put("title", "title======" + (i + size));
            map.put("summary", "summary----" + (i + size));
            datas.add(map);
        }


    }

}
public class RecyclerAdapter4 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    private List<Map<String, String>> mDatas;
    private final int TYPE_COMMON = 0;
    private final int TYPE_FOOTER = 1;

    public RecyclerAdapter4(Context context, List<Map<String, String>> mDatas) {
        this.context = context;
        this.mDatas = mDatas;
    }

    /**
     * 获得指定的位置上的显示类型
     */
    @Override
    public int getItemViewType(int position) {
        if (position == getItemCount() - 1) {
            return TYPE_FOOTER;
        }
        return TYPE_COMMON;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_COMMON) {
            View itemView = LayoutInflater.from(context).inflate(R.layout.item_recycler04, parent, false);
            ItemViewHolder itemViewHolder = new ItemViewHolder(itemView);
            return itemViewHolder;
        } else {
            View footerView = LayoutInflater.from(context).inflate(R.layout.item_footer, parent, false);
            FooterViewHolder holder = new FooterViewHolder(footerView);
            return holder;
        }
    }

    @Override
    public int getItemCount() {
        return mDatas.size() == 0 ? 0 : mDatas.size() + 1;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ItemViewHolder) {
            ((ItemViewHolder) holder).tv_name.setText(mDatas.get(position).get("title"));
            ((ItemViewHolder) holder).tv_summary.setText(mDatas.get(position).get("summary"));
        }
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {
        TextView tv_name, tv_summary;

        public ItemViewHolder(View itemView) {
            super(itemView);
            tv_name = (TextView) itemView.findViewById(R.id.tv_name);
            tv_summary = (TextView) itemView.findViewById(R.id.tv_summary);
        }
    }

    class FooterViewHolder extends RecyclerView.ViewHolder {

        public FooterViewHolder(View itemView) {
            super(itemView);
        }
    }
}

5. RecyclerView的网络 数据分页加载
public class RecycleerActivity05 extends AppCompatActivity {
    private String url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=";
    private int page = 1;
    private RecyclerView mRecyclerView;
    private SwipeRefreshLayout swipeRefreshLayout;

    private List<ParseFoodData.Food> mDatas;
    private LinearLayoutManager manager;
    private FoodAdapter adapter;

    private boolean isLoading = false;

    Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycleer04);
        initView();
        loadData(url, 1);
        setEvent();
    }

    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.id_rv);
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.sr1);
        swipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN);
        manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(manager);
        mDatas = new ArrayList<>();
        adapter = new FoodAdapter(this, mDatas);
        mRecyclerView.setAdapter(adapter);
    }

    private void loadData(String url, int index) {
        RequestParams params = new RequestParams(url + index);
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                List<ParseFoodData.Food> list = ParseFoodData.parseData(result);
                if (list != null && list.size() != 0) {
                    mDatas.addAll(list);
                    page++;
                    adapter.notifyDataSetChanged();
                    isLoading = false;
                } else {
                    adapter.notifyItemRemoved(adapter.getItemCount());
                }
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
            }

            @Override
            public void onCancelled(CancelledException cex) {
            }

            @Override
            public void onFinished() {
            }
        });
    }

    private void setEvent() {
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        swipeRefreshLayout.setRefreshing(false);
                    }
                }, 2000);
            }
        });

        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                int lastPos = manager.findLastVisibleItemPosition();
                if (lastPos + 1 == adapter.getItemCount()) {
                    if (swipeRefreshLayout.isRefreshing()) {
                        return;
                    }
                    if (!isLoading) {
                        isLoading = true;
                        loadData(url, page);
                    }
                }
            }
        });
    }

}

public class FoodAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private List<ParseFoodData.Food> datas;
    private final int TYPE_COMMON = 0;
    private final int TYPE_FOOTER = 1;

    public FoodAdapter(Context context, List<ParseFoodData.Food> datas) {
        this.context = context;
        this.datas = datas;
    }
    /**
     * 获得指定的位置上的显示类型
     * */
    @Override
    public int getItemViewType(int position) {
        if (position == getItemCount() - 1) {
            return TYPE_FOOTER;
        }
        return TYPE_COMMON;
    }
    //创建viewholder的方法,可以通过判断viewType,创建不同位置的不同布局
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_COMMON) {
            View itemview = LayoutInflater.from(context).inflate(R.layout.item_list, parent, false);
            ItemViewHolder itemViewHolder = new ItemViewHolder(itemview);
            return itemViewHolder;
        } else {
            View footView = LayoutInflater.from(context).inflate(R.layout.item_footer, parent, false);
            FooterViewHolder holder = new FooterViewHolder(footView);
            return holder;
        }

    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
         if (holder instanceof ItemViewHolder){
             ((ItemViewHolder)holder).tv_name.setText(datas.get(position).getTitle());
             ((ItemViewHolder)holder).tv_summary.setText("材料:"+datas.get(position).getFood_str());

             ViewGroup.LayoutParams lp = ((ItemViewHolder) holder).icon.getLayoutParams();

             lp.height =200;
             lp.width=300;
             ((ItemViewHolder) holder).icon.setLayoutParams(lp);
             ImageOptions options = new ImageOptions.Builder().setLoadingDrawableId(R.mipmap.ic_launcher)
                     .setFailureDrawableId(R.mipmap.ic_launcher).build();
             x.image().bind(((ItemViewHolder) holder).icon,datas.get(position).getPic(),options);

         }
    }

    //获取数据的数量
    @Override
    public int getItemCount() {
        return datas.size() == 0 ? 0 : datas.size() + 1;
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {
        TextView tv_name, tv_summary;
        ImageView icon;

        public ItemViewHolder(View itemView) {
            super(itemView);
            tv_name = (TextView) itemView.findViewById(R.id.tv_name);
            tv_summary = (TextView) itemView.findViewById(R.id.tv_summary);
            icon = (ImageView) itemView.findViewById(R.id.icon);
        }
    }

    class FooterViewHolder extends RecyclerView.ViewHolder {

        public FooterViewHolder(View itemView) {
            super(itemView);
        }
    }


}



导入的包有 如下 


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.jht.administrator.day05.RecycleerActivity04">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/sr1"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/id_rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </android.support.v7.widget.RecyclerView>
    </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值