关闭

RecyclerView详解

标签: RecyclerViewFloatingActionButtonSnack
197人阅读 评论(0) 收藏 举报
分类:

1.android5.0重要控件的介绍

①RecyclerView介绍:

     替换listview的盛装数据的控件,运用好这个控件能够很多的避免listview与scrollview的滚动冲突,选择RecyclerView性能更优,listview能做的事情,RecyclerView样样都会,甚至更多。

②FloatingActionButton介绍

   它是一种带有悬浮效果的控件,可以作为提示,编辑,分享的作用。

③Snack介绍

  更好的替代了Toast的功效,是一种不错的弹出效果的控件。

2.具体用法

添加依赖:

compile 'com.android.support:design:24.2.1'

①定义RecyclerView,FloatingActionButton控件

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<!-- 必须把anchor设置为CoordinatorLayout布局的id-->
<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    android:src="@mipmap/icon"
    app:backgroundTint="#FF4081"
    app:borderWidth="0dp"
    app:elevation="6dp"
    app:fabSize="normal"
    app:layout_anchor="@id/coordinator_layout"
    app:layout_anchorGravity="bottom|right"
    app:pressedTranslationZ="12dp"
    app:rippleColor="#a6a6a6" />

②为RecyclerView设置动画

final RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
③为RecyclerView设置布局管理器

1.线性布局:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
2.瀑布流布局:

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
 ④设置adpter:自定义adapter extends RecyclerView.Adapter

public class MyRecyclerAdapter extends RecyclerView.Adapter

⑤重写三个重载函数

1.onCreateViewHolder

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
    MyViewHolder viewHolder = new MyViewHolder(view);
    //为每个item注册点击事件
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mListener != null) {
                //注意这里使用getTag方法获取数据
                mListener.ItemClickListener(v,(String)v.getTag());
            }
        }
    });
    return viewHolder;
}

在这里,创建真正的viewholder;

2.onBindViewHolder

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

        ViewGroup.LayoutParams params =  holder.itemView.getLayoutParams();//得到itemLayoutParams布局参数
        params.height = heights.get(position);//把随机的高度赋予item布局
        holder.itemView.setLayoutParams(params);//params设置给item布局

    ((MyViewHolder)holder).mTv.setText(lists.get(position));//为控件绑定数据
        if(mListener!=null){//如果设置了监听那么它就不为空,然后回调相方应的法
            holder.itemView.setTag(lists.get(position));
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mListener.ItemClickListener(view,"dianji");
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int pos = holder.getLayoutPosition();//得到当前点击item的位置pos
                    mListener.ItemLongClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理
                    return true;
                }
            });
        }
}

为RecyclerView的每个item设置了点击事件,并且为view中的子view设置值;

3.getItemCount最为简单

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

3.为RecyclerView设置点击事件

①申明点击的接口

public interface OnRecyclerViewItemClickListener{
    void ItemClickListener(View view, String data);
    void ItemLongClickListener(View view, int postion);
}
②创建点击的静态方法

public static void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
    mListener = listener;
}
注意这个方法必须保证是静态。

③申明同上同类型的静态listener

private static OnRecyclerViewItemClickListener mListener;
④在onBindViewHolder中通过listener调用点击事件

if(mListener!=null){//如果设置了监听那么它就不为空,然后回调相方应的法
    holder.itemView.setTag(lists.get(position));
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mListener.ItemClickListener(view,"dianji");
        }
    });
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            int pos = holder.getLayoutPosition();//得到当前点击item的位置pos
            mListener.ItemLongClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理
            return true;
        }
    });
}

4.主代码展示

public class MainActivity extends ActionBarActivity {
    private CoordinatorLayout mCoordinatorLayout;
    MyRecyclerAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);
        mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator_layout);

        final RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

        List<String> lists = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            lists.add(i + "");
        }
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
        adapter = new MyRecyclerAdapter(this, lists);
        mRecyclerView.setAdapter(adapter);
        MyRecyclerAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnRecyclerViewItemClickListener() {
            @Override
            public void ItemClickListener(View view, String data) {
                //Toast.makeText(MainActivity.this,"dainjile",Toast.LENGTH_SHORT).show();
                Snackbar.make(mCoordinatorLayout,"点击了",Snackbar.LENGTH_SHORT).show();
            }

            @Override
            public void ItemLongClickListener(View view, int postion) {

            }
        });



        final FloatingActionButton mFloatingActionButton = (FloatingActionButton) findViewById(R.id.fab);
        mFloatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               mRecyclerView.scrollToPosition(0);
            }
        });


    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.snackbar_item:
                //mCoordinatorLayout传给Snackbar
                Snackbar.make(mCoordinatorLayout, "Snackbar", Snackbar.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}
这里,为FloatingActionButton设置了一个关于RecyclerView的item定位的点击事件

final FloatingActionButton mFloatingActionButton = (FloatingActionButton) findViewById(R.id.fab);
        mFloatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               mRecyclerView.scrollToPosition(0);
            }
        });
这里的Snack的用法如下,很简单,它不需要在xml文件中定义

Snackbar.make(mCoordinatorLayout, "Snackbar", Snackbar.LENGTH_SHORT).show();
注意:第一个参数为Snack要显示的viewgroup!!!

效果图:


好了,今天的分享就到此为止;在实战中学习,在实战中精进,我是张星,欢迎大家的关注!

















1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:60733次
    • 积分:1759
    • 等级:
    • 排名:千里之外
    • 原创:102篇
    • 转载:0篇
    • 译文:0篇
    • 评论:47条
    最新评论