zoukankan      html  css  js  c++  java
  • RecyclerView0基于使用

    (转载请注明出处:http://www.kennethyo.me/post/android/recyclerviewchu-ji-shi-yong)

    RecyclerView是Android在v7包中包括了一个新的widget。RecyclerView是一个ListView进阶版,但不继承与AdapterView。相比ListViewRecyclerView更加灵活和先进。

    1。导入RecyclerView

    首先要保证SDK ToolsAndroid Support Repository为最新版。

    例如以下图:



    其次,在你的demoproject里选中Project Structurebutton,而且选择app —— Dependencies —— “+” —— Library dependency,去加入支持包,例如以下图:


    最后。在新的对话框里选中com.android.support:recyclerview-v7:21.0.0,点击OK。

    例如以下图:


    这里就顺利的导入了RecyclerView

    2,使用RecyclerView

    在布局文件里使用RecyclerView。跟其它自己定义控件一样,例如以下:

    <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=".MainActivity">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </RelativeLayout>
    

    由于日常开发中,我们大多数都是依照UI去布局每一个item,所以这里我没与图省事用Android自带的布局。例如以下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
    
            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:textStyle="bold"
                android:background="@android:color/holo_blue_light"
                android:textColor="@android:color/holo_red_light"
                android:gravity="center_vertical"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:text="New Text" />
    
    </LinearLayout>
    

    以下就是代码了:

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    
            //LinearLayoutManager能够自己定义实现不同的动画效果和布局效果
            //这里设置为LinearLayoutManager.HORIZONTAL变成为了一个能够横向滑动的ListView,赞不赞?
            LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
            recyclerView.setLayoutManager(layoutManager);
            recyclerView.setHasFixedSize(false);//adapter的改变不会改变RecyclerView的大小
    
            String[] strings = new String[50];
            for (int i = 0;i<50;i++){
                strings[i] = String.valueOf(i);
            }
    
            StringRecyclerAdapter adapter = new StringRecyclerAdapter(strings);
    
            recyclerView.setAdapter(adapter);
    
        }
    

    能够明白看到的是,RecyclerView通过(RecyclerView) findViewById(R.id.recyclerView)初始化之后,不仅要像ListView一样要放入Adapter进行数据和布局的适配,并且还要额外加入一个LinearLayoutManager

    这个Manager就是我们的布局管理工具类,这里不仅能够用常规的竖直方向布局。还有横向的滑动的布局,以后再也不会由于没有横向滑动的ListView去头疼自己定义了。

    通过自己定义LinearLayoutManager也能够实现不同的动画效果,和移动效果。
    RecyclerView的Adapter和ListView的Adapter也是不同的。RecyclerView的Adapter要继承RecyclerView.Adapter<VH extends ViewHolder>,而且ViewHolder要继承与ViewHolder.RecyclerView。详细代码例如以下:

    public class StringRecyclerAdapter extends RecyclerView.Adapter<StringRecyclerAdapter.ViewHolder> {
        private String[] strings;
    
        public StringRecyclerAdapter(String[] strings) {
            this.strings = strings;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View view = View.inflate(viewGroup.getContext(), R.layout.adapter_string_recylcer, null);
    
           //这里发现不给item布局加入LayoutParams,会直接默觉得WRAP_CONTENT。WRAP_CONTENT布局。

    view.setPadding(20, 0,0, 0); view.setFocusable(true); RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); lp.leftMargin = 10; lp.rightMargin = 5; lp.topMargin = 20; lp.bottomMargin = 15; view.setLayoutParams(lp); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(ViewHolder viewHolder, int i) { viewHolder.textView.setText(StringRecyclerAdapter.class.getSimpleName() + getValueAt(i)); } public String getValueAt(int i) { return strings[i]; } @Override public int getItemCount() { return this.strings == null ? 0 : strings.length; } public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public TextView textView; public ViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView); //由于RecyclerView没用setOnItemClickListener,所以在这里实现了点击事件 //况且,如今有越来越多的设计,会在每一个item点击不同位置,有不同的响应 textView.setOnClickListener(this); } @Override public void onClick(View v) { Toast.makeText(v.getContext(),((TextView)v).getText(),Toast.LENGTH_SHORT).show(); } } }

    onCreateViewHolder方法中,我们须要把载入布局和ViewHolder绑定起来。这里有个问题。不知道是Android的bug。还是有益这么设计的,须要我们主动写代码给item设置LayoutParams
    onBindViewHolder中负责数据绑定。


    这里有一个问题,RecyclerView没有setOnItemClickListener方法,所以我在里面对TextView加入了点击事件,如今有越来越多的设计,会在每一个item点击不同位置。有不同的响应。


    Demo链接

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    win10让屏幕壁纸动态变化某文件夹下的图片
    win10查看桌面壁纸路径
    Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the serv
    将网站发布到阿里云的Linux服务器上(简述)
    图解MySQL 内连接、外连接、左连接、右连接、全连接
    JAVA _____Scanner用法
    JAVA数组翻转
    Lucene 01
    [转载] Relearning to Learn
    二进制包安装Kubernetes集群环境完整版
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4677073.html
Copyright © 2011-2022 走看看