RecyclerView 的使用

来源:互联网 发布:unity3d前景怎么样 编辑:程序博客网 时间:2024/05/31 00:40
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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新车上牌找不到流水号怎么办 开票数量比入库数量少怎么办 我贷款的app忘了怎么办 网贷名字忘了怎么办 附件太大邮件发不出去怎么办 孩子出生足印单子丢了怎么办 保险名字写错了怎么办 行驶证和身份证名字不一样怎么办 上户后发现合格证和车不一样怎么办 新车上户重量不一样怎么办 医保卡和身份证名字不一样怎么办 保险标志保险卡都没给怎么办 新买的电动自行车不符合标准怎么办 电费的户号12位怎么办? 买到过期的药品怎么办 淘宝代销宝贝信息不全怎么办 en和eng读不明显怎么办 快递收件人填错手机号没收到怎么办 快递收件人电话写错了怎么办 收件人电话写错了怎么办 大货要出货了数量错误怎么办 手被烫伤留疤怎么办 cbg被下单不能改价怎么办 浪琴手表日期中午跳怎么办 社保一体卡丢失了怎么办 京东付款七天不发货怎么办 电动车电机锁钥匙丢了怎么办 电瓶车锁钥匙丢了怎么办 苹果平板ld忘了怎么办 平板版本太低6.0怎么办 ios平板版本太低怎么办 微信公众号重名怎么办 发票规格型号填错了怎么办 鲁大师检测硬盘有问题怎么办 英文成绩单翻译错了怎么办 川航订机票名字写错了怎么办 亚航电子登机牌没有保存怎么办 cfa考试准考证名字有错怎么办 火车票护照号错了怎么办 国际机票名字错一个字怎么办 国际机票名字拼音错了怎么办