简单的Android RecyclerView 使用小Demo

参考:

(Android dev summit 2015):    https://www.youtube.com/watch?v=imsr8NrIAMs

1、简介

        RecyclerView 是新推出的来代替ListView的控件。RecyclerView 标准化了ViewHolder类似于ListViewcontentView用来做视图缓存。
        优点:
  •            可以通过设置L ayoutManager来实现ListView、grideView和瀑布流效果。
  •            而且还可以设置横向和纵向显示。
  •            自带ItemAnimation动画。
        
    通过LayoutManager来设置三种显示效果。
            LinearLayoutManager:listView,可以横竖方向切换
            GrideLayoutManager:GrideView效果
            StaggereGrideLayoutMagager:瀑布流效果。
cursor_recyclerview.setLayoutManager(new LinearLayoutManager(this));// 默认纵向
        cursor_recyclerview.setLayoutManager(new GridLayoutManager(this, 3));//3:列数
        types_recyclerview.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL))

2、实现方式。

       a、 首先到导入RecyclerView的support包。
         compile  'com.android.support:recyclerview-v7:23.3.0'
        b、代码实现:
 refresh_ly = (SwipeRefreshLayout) findViewById(R.id.refresh_ly);
        //横向和纵向
        layoutManager = new LinearLayoutManager(this);
        recyclerview.setLayoutManager(layoutManager);
        recyclerview.setHasFixedSize(true);//如果每个item的类型是一样的,可以设置为true加快运行效率

        c、adapter的是实现,
                RecyclerVidew的adapter中,OncreaterViewHolder()中创建视图,在onBindViewHolder中设置数据。   
public class MyRecyclerViewAdapterextends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

private List<String> mList;
    private Context mContext;
    private RecyclerView recyclerview;
    private RecyclerViewActivity recyclerViewActivity;


    public MyRecyclerViewAdapter(Context context, List<String> list, RecyclerView recyclerview) {
mList = list;
mContext = context;
        this.recyclerview = recyclerview;
        this.recyclerViewActivity = (RecyclerViewActivity) context;
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerviewitem, null);
ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
if (mList != null && mList.size() > position)
            holder.menu_title.setText(mList.get(position));
holder.setItemOnClickListener(new MyClicekListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
if (position != RecyclerView.NO_POSITION) {
if (isLongClick) {
                        Toast.makeText(mContext, "长按" + mList.get(position), Toast.LENGTH_SHORT).show();
} else {//  单击
switch (recyclerViewActivity.getCheckMode()) {
case R.id.rb_itemclick:
                                Toast.makeText(mContext, "点击" + mList.get(position), Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.rb_itemadd:
                                addItem(view);
                                break;
                            case R.id.rb_itemdelete:
                                deleteItem(view);
                                break;
                            case R.id.rb_itemchange:
                                achangeItem(view);
                                break;
}
                    }
                }
            }
        });

}


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

/**
     * 删除item
     *
     * @param view 要删除的item
     */
private void deleteItem(View view) {
int pos = recyclerview.getChildAdapterPosition(view);
        if (pos != RecyclerView.NO_POSITION) {
mList.remove(pos);
notifyItemRemoved(pos);
}
    }

/**
     * 添加item
     *
     * @param view 添加item在这个控件之上
*/
private void addItem(View view) {
int pos = recyclerview.getChildAdapterPosition(view);
        if (pos != RecyclerView.NO_POSITION) {
mList.add(pos, "新加的item" + mList.size());//添加的位置,和添加的内容
notifyItemInserted(pos);
}
    }
/**
     * 添加item
     *
     * @param view 添加item在这个控件之上
*/
private void achangeItem(View view) {
int pos = recyclerview.getChildAdapterPosition(view);
        if (pos != RecyclerView.NO_POSITION) {
mList.set(pos, " 改变的item" + pos);//添加的位置,和添加的内容
notifyItemChanged(pos);
}
    }

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {

private TextView menu_title;
        private MyClicekListener mOnClickListener;

        public ViewHolder(View itemView) {
super(itemView);
menu_title = (TextView) itemView.findViewById(R.id.menu_title);

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

public void setItemOnClickListener(MyClicekListener onClickListener) {
mOnClickListener = onClickListener;
}

@Override
public void onClick(View v) {
mOnClickListener.onClick(v, getAdapterPosition(), false);
}

@Override
public boolean onLongClick(View v) {
mOnClickListener.onClick(v, getAdapterPosition(), true);
            return true;
}
    }
}



    a、多类型Item
          基本上的逻辑实现跟一般的一样,就是要注意下类型的区分,RecyclerViewAdapter没有了以前的getTypes等方法,而是在OnCreateViewHolder里面有类型参数。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPES1) {
return new ImageViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerviewimageitem, null));
} else {
return new TextViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerviewitem, null));
}
}

    b、cursorAdapter的实现。
            RecyclerView没有CursorAdapter,所以要自己写一个adapter,具体参考Demo中Init方法,就是仿照ListView的CursorAdapter写的。大体上一致,就是注册了两个观察者去监听数据库的变化。然后把刷新方法改成notifyDataSetChange()即可。
    c、动画。
        RecyclerView自带默认动画,要想修改可以通过
recyclerview.setItemAnimator(isChecked ? mDefaultItemAnimator : mDefaultItemAnimator);
去修改。不想自己写,可以上github上找开源动画。
一些动画开源参考:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值