RecyclerView使用

android.support.v7.widget.RecyclerView是v7包裏的一個widget,很是強大的一個控件,徹底能夠代替listview,gridview和瀑布流。
java

這裏主要講三點:android

  1. 爲recyclerView設置LayoutManagerapp

  2. RecyclerView.Adapterdom

  3. 刪除和添加數據的動畫效果展現ide

1.動畫

RecyclerView中有三種LayoutManager,以下:
this

LayoutManager
Orientation
LinearLayoutManager HORIZONTAL、VERTICAL
GridLayoutManager HORIZONTAL、VERTICAL
StaggeredGridLayoutManager HORIZONTAL、VERTICAL

解釋一下若設置成 LinearLayoutManager,就和ListView的展現效果基本同樣,但人家還能夠看成水平方向的listView;若設置GridLayoutManager就至關於girdView,一樣能夠設置成水平方向滑動;若設置成StaggeredGridLayoutManager,就是瀑布流了,一樣能夠設置成水平方向滑動。 spa

例如:code

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
//設置layoutmanager
recyclerView.setLayoutManager(linearLayoutManager);

2.RecyclerView.Adapterxml

    這個RecyclerView.Adapter可不得了啊,首先能夠帶範型,看源碼:

public static abstract class Adapter<VH extends ViewHolder> {。。。}

而後是個抽象類,舉個例子:

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

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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.content.setText(arrayList.get(position));

    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder{

        private TextView content;
        public ViewHolder(View itemView) {
            super(itemView);
            content = (TextView) ((FrameLayout) itemView).getChildAt(0);
        }
    }
}

這裏我自定了一個ViewHolder繼承RecyclerView.ViewHolder,說一下MyAdapter的執行流程:首先執行onCreateViewHolder方法,返回了咱們自定義的ViewHolder,而後onBindViewHolder方法。能夠看出RecyclerView.Adapter對ViewHolder進行了封裝。

3.刪除和添加數據的動畫效果展現,若是是baseAdapter怎麼刷新呢,調用notifyDataSetChanged()方法,那在使用RecyclerView時呢:

notifyItemInserted(int position);
notifyItemRemoved(int position);

並且還有動畫效果。

好了來個例子:

R.layout.activity_recycler_view文件:

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.sumu.gefdemo.activity.RecyclerViewActivity">

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

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

actiivty中:

package com.sumu.gefdemo.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.sumu.gefdemo.R;

import java.util.ArrayList;
import java.util.Random;

public class RecyclerViewActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private MyAdapter myAdapter;

    private ArrayList<String> arrayList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_view);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        /**
         * 三種LayoutManager
         */
        //1
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        //2.
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4);
        gridLayoutManager.setOrientation(GridLayoutManager.HORIZONTAL);
        //3.
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);
        //設置layoutmanager
        recyclerView.setLayoutManager(staggeredGridLayoutManager);

        Random random = new Random();

        for (int i = 0;i < 100;i++){
            random.nextInt();
            arrayList.add(i + "gefufeng" + random.nextInt(10000000));
        }
        myAdapter = new MyAdapter();
        recyclerView.setAdapter(myAdapter);
    }
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{

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

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.content.setText(arrayList.get(position));

        }

        @Override
        public int getItemCount() {
            return arrayList.size();
        }
        public class ViewHolder extends RecyclerView.ViewHolder{

            private TextView content;
            public ViewHolder(View itemView) {
                super(itemView);
                content = (TextView) ((FrameLayout) itemView).getChildAt(0);
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0,1,1,"add");
        menu.add(Menu.NONE,2,2,"delete");
        return true;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == 1){
            arrayList.add(1,"gefufenggefufenggefufenggefufenggefufeng");
            myAdapter.notifyItemInserted(1);
        }else{
            arrayList.remove(2);
            myAdapter.notifyItemRemoved(2);
        }
        return super.onOptionsItemSelected(item);
    }
}

R.layout.myview文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
    <TextView
        android:padding="10dp"
        android:background="#3f3"
        android:gravity="center"
        android:text="gefufebg"
        android:layout_margin="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />

</FrameLayout>

效果圖(其中之一):

相關文章
相關標籤/搜索