初步使用RecyclerView實現瀑布流


先看效果

 

 

關於RecyclerView,真的是很強大。

個人覺得主要方便的地方是

1.直接可以設置條目布局,通過setLayoutManager

  

  1. LinearLayoutManager:線性布局,橫向或者縱向滑動列表
  2. GridLayoutManager:表格布局
  3. StaggeredGridLayoutManager:流式布局,例如瀑布流效果

2.可以直接設置分割線       addItemDecoration方法

3.直接設置添加刪除item動畫   setItemAnimator方法

4.對View的復用性好  (這個是別人總結的,我還沒看源碼)

5.對於分割線,和增刪動畫,github上開源的類很多

 

 

下面看看怎么用法

   一 導入包,v7的recyclerview包

  二 布局

 

activity_main.xml

<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.example.myrecyclerview.MainActivity" >

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

</RelativeLayout>

item布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#8A2BE2"
    android:layout_margin="3dp"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/id_num"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="1" />
</FrameLayout>

 

三,創建Adapter

 

package com.example.myrecycleviewdemo;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
    Context mcontext;
    List<String> mlist;
    List<Integer> mheight;
    public MyAdapter(Context context, List<String> list) {
        mcontext=context;
        mlist=list;
        //隨機高度集合
        mheight=new ArrayList<Integer>();
        for(int i=0;i<mlist.size();i++){
            mheight.add((int)(100+Math.random()*300));
        }
    }
    
    


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


    //找到布局中空間位置
    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView tv;
        public MyViewHolder(View arg0) {
            super(arg0);
            
            tv=(TextView) arg0.findViewById(R.id.id_num);
        }
        
    }


    //綁定,渲染數據到view中
    @Override
    public void onBindViewHolder(MyViewHolder holder, int arg1) {
        
        LayoutParams lp=holder.tv.getLayoutParams();
        lp.height=mheight.get(arg1);
        holder.tv.setLayoutParams(lp);
        holder.tv.setText(mlist.get(arg1));
        
        
        
    }



    //先執行onCreateViewHolder
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int arg1) {
        
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
               mcontext).inflate(R.layout.item, parent,
                false));
        return holder;
    }




    public void add(int pos) {
    
        mlist.add(pos, "insert");
        mheight.add((int)(100+Math.random()*300));
        notifyItemInserted(pos);
    }




    public void del(int pos) {
        
        mlist.remove(pos);
        notifyItemRemoved(pos);
    }


}

這里的Adapter需要繼承RecyclerView.Adapter,需要實現3個方法:

- onCreateViewHolder()

- onBindViewHolder()

- getItemCount()

 

最后,MainActivity

package com.example.myrecycleviewdemo;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {
    RecyclerView recyclerView;
    List<String> mlist;
    MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        
        initview();
        
    }
    private void initview() {
        recyclerView=(RecyclerView) findViewById(R.id.recyclerview_vertical);
        adapter=new MyAdapter(this,mlist);
        //設置動畫
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        //設置分割線
        //recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
        //recyclerView.setLayoutManager(new LinearLayoutManager(this));
        //設置布局
         recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL));
        recyclerView.setAdapter(adapter);
    }
    private void initData() {
        mlist=new ArrayList<String>();
        for(int i=0;i<50;i++){
            mlist.add("number"+i);
        }
        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        
        switch (item.getItemId())
        { 
        case R.id.add:
            adapter.add(1);
            break;
        case R.id.del:
            adapter.del(1);
            break;
        }
    
        return true;
    }
}

更換布局,分割線,動畫的方式很簡單,直接通過方法讓不同的類當參數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM