zoukankan      html  css  js  c++  java
  • 初步使用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;
        }
    }

    更换布局,分割线,动画的方式很简单,直接通过方法让不同的类当参数。

  • 相关阅读:
    浏览器渲染
    微信h5页面制作总结
    chrome开发工具指南之综述
    零碎记录
    docker 容器已经启动,但是无法访问
    Docker的安装及使用
    python目录选择
    centos7 设置进程开机自启动
    语句中传入变量
    kafka -> structuredStreaming读取kafka日志 ->自定义输出到mysql
  • 原文地址:https://www.cnblogs.com/xurui1995/p/5745069.html
Copyright © 2011-2022 走看看