RecyclerView实现ListView、GridView、瀑布流

转载请注明出处:RecyclerView实现ListView、GridView、瀑布流_Mr_Leixiansheng的博客-CSDN博客

ListView功能

GridView功能

瀑布流功能

作用:可以代替ListView,使用更灵活

步骤:

1、引入RecyclerView包

2、布局文件使用RecyclerView控件(全包名路径 )

3、活动中找到RecyclerView,设置布局管理,设置数据

4、自定义适配器继承RecyclerView.Adapter,定义内部ViewHolder并且重写方法。

重写方法时需要自己添加RecyclerView显示的布局文件(注意:布局父类高度不应该为match_parent )

5、引入一个 分割线类

6、活动中为RecyclerView添加适配器,添加分割线

代码如下:

1、引入RecyclerView包

build.grade(app)

compile 'com.android.support:recyclerview-v7:24.2.1'

2、布局文件使用RecyclerView控件(全包名路径 )

<?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"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
</LinearLayout>

3、活动中找到RecyclerView,设置布局管理,设置数据

4、自定义适配器继承RecyclerView.Adapter,定义内部ViewHolder并且重写方法。

添加增、删功能;添加点击响应

package com.leixiansheng.test;

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

import java.util.List;

/**
 * Created by Leixiansheng on 2017/6/12.
 */
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHodler> {
    private List<String> dataList;

    public interface OnItemClickListner {
        void onItemClick(View view, int postion);
        void onItemLongClick(View view, int postion);
    }

    private OnItemClickListner onItemClickListner;

    //暴露接口
    public void setOnItemClickListner(OnItemClickListner listner) {
        this.onItemClickListner = listner;
    }

    public RecyclerAdapter(List<String> dataList) {
        this.dataList = dataList;
    }

    @Override
    public ViewHodler onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.rv_item, parent, false);
        ViewHodler hodler = new ViewHodler(view);
        return hodler;
    }

    @Override
    public void onBindViewHolder(final ViewHodler holder, final int position) {
        holder.textView.setText(dataList.get(position));

        //设置点击响应
        if (onItemClickListner != null) {
            //点击
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //获取当前屏幕上的位置,避免插入后position不对
                    int layoutPosition = holder.getLayoutPosition();
                    onItemClickListner.onItemClick(holder.itemView, layoutPosition);
                }
            });
            //长按
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    int layoutPosition = holder.getLayoutPosition();
                    onItemClickListner.onItemLongClick(holder.itemView, layoutPosition);
                    return false;
                }
            });
        }
    }

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

    //插入数据
    public void addData(int pos) {
        dataList.add(pos, "Insert One");
//        dataList.add("Insert One");
        notifyItemInserted(pos);
    }

    //移除数据
    public void deleData(int pos) {
        dataList.remove(pos);
        notifyItemRemoved(pos);
    }

    public static class ViewHodler extends RecyclerView.ViewHolder{
        TextView textView;

        public ViewHodler(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.item_tv);
        }
    }
}

重写方法时需要自己添加RecyclerView显示的布局文件(注意:布局父类高度不应该为match_parent )

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/item_tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

5、引入一个 分割线类

package com.leixiansheng.test;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

/**
 * This class is from the v7 samples of the Android SDK. It's not by me!
 * <p/>
 * See the license above for details.
 */
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
	private static final int[] ATTRS = new int[] { android.R.attr.listDivider };
	public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
	public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

	private Drawable mDivider;

	private int mOrientation;


	public DividerItemDecoration(Context context, int orientation)
	{
		final TypedArray a = context.obtainStyledAttributes(ATTRS);
		mDivider = a.getDrawable(0);
		a.recycle();
		setOrientation(orientation);
	}

	public void setOrientation(int orientation)
	{
		if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST)
		{
			throw new IllegalArgumentException("invalid orientation");
		}
		mOrientation = orientation;
	}

	@Override
	public void onDraw(Canvas c, RecyclerView parent)
	{
		 if (mOrientation == VERTICAL_LIST) {
	            drawVertical(c, parent);
	        } else {
	            drawHorizontal(c, parent);
	        }
	}

	public void drawVertical(Canvas c, RecyclerView parent)
	{
		final int left = parent.getPaddingLeft();
		final int right = parent.getWidth() - parent.getPaddingRight();

		final int childCount = parent.getChildCount();

		for (int i = 0; i < childCount; i++)
		{
			final View child = parent.getChildAt(i);
			RecyclerView v = new RecyclerView(
					parent.getContext());
			final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
					.getLayoutParams();
			final int top = child.getBottom() + params.bottomMargin;
			final int bottom = top + mDivider.getIntrinsicHeight();
			mDivider.setBounds(left, top, right, bottom);
			mDivider.draw(c);
		}
	}

	public void drawHorizontal(Canvas c, RecyclerView parent)
	{
		final int top = parent.getPaddingTop();
		final int bottom = parent.getHeight() - parent.getPaddingBottom();

		final int childCount = parent.getChildCount();
		for (int i = 0; i < childCount; i++)
		{
			final View child = parent.getChildAt(i);
			final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
					.getLayoutParams();
			final int left = child.getRight() + params.rightMargin;
			final int right = left + mDivider.getIntrinsicHeight();
			mDivider.setBounds(left, top, right, bottom);
			mDivider.draw(c);
		}
	}

	@Override
	public void getItemOffsets(Rect outRect, int itemPosition,
			RecyclerView parent)
	{
		if (mOrientation == VERTICAL_LIST)
		{
			outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
		} else
		{
			outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
		}
	}
}

6、活动中为RecyclerView添加适配器,添加分割线,点击响应

package com.leixiansheng.test;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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.widget.Toast;

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

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private LinearLayoutManager layoutManager;
    private RecyclerAdapter adapter;
    private List<String> dataList = new ArrayList<>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        //设置布局管理
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        //配置添加适配器
        adapter = new RecyclerAdapter(dataList);
        recyclerView.setAdapter(adapter);
        //设置分割线(这样就可以代替ListView)
        recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));

        adapter.setOnItemClickListner(new RecyclerAdapter.OnItemClickListner() {
            @Override
            public void onItemClick(View view, int postion) {
                Toast.makeText(MainActivity.this, dataList.get(postion)+"",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClick(View view, int postion) {
                Toast.makeText(MainActivity.this, dataList.get(postion)+" 长按",Toast.LENGTH_SHORT).show();
            }
        });
    }

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

    //选择不同显示模式
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.add:
                adapter.addData(1);
                break;
               case R.id.remove:
                adapter.deleData(1);
                break;
               case R.id.list_view:
                recyclerView.setLayoutManager(new LinearLayoutManager(this));
                break;
              case R.id.grid_view:
                recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
                break;
              case R.id.h_grid_view:
                recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.HORIZONTAL));
                break;
              case R.id.s_grid_view:
                  Intent intent = new Intent(this, StaggActivity.class);
                  startActivity(intent);
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    private void initData() {
        for (int i = 0; i < 100; i++) {
            dataList.add("显示内容" + i);
        }
    }
}

补充瀑布流:

 1、自定义适配器继承RecyclerView.Adapter,定义内部ViewHolder并且重写方法。(和前面相识,只是在定义高度处不同)

2、新建StaggActivity活动

代码如下:

 1、自定义适配器继承RecyclerView.Adapter,定义内部ViewHolder并且重写方法。(和前面相识,只是在定义高度处不同)

package com.leixiansheng.test;

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

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

/**
 * Created by Leixiansheng on 2017/6/12.
 */
public class StaggAdapter extends RecyclerView.Adapter<StaggAdapter.ViewHodler> {
    private List<String> dataList;
    private List<Integer> heightList;

    public interface OnItemClickListner {
        void onItemClick(View view, int postion);
        void onItemLongClick(View view, int postion);
    }

    private RecyclerAdapter.OnItemClickListner onItemClickListner;

    //暴露接口
    public void setOnItemClickListner(RecyclerAdapter.OnItemClickListner listner) {
        this.onItemClickListner = listner;
    }

    public StaggAdapter(List<String> dataList) {
        this.dataList = dataList;
        heightList = new ArrayList<Integer>();

        for (int i = 0; i < dataList.size(); i++) {
            heightList.add((int) (100 + Math.random() * 300));
        }
    }

    @Override
    public ViewHodler onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.rv_item, parent, false);
        ViewHodler hodler = new ViewHodler(view);
        return hodler;
    }

    @Override
    public void onBindViewHolder(final ViewHodler holder, int position) {
        ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
        params.height = heightList.get(position);
        holder.itemView.setLayoutParams(params);
        holder.textView.setText(dataList.get(position));

        //设置点击响应
        if (onItemClickListner != null) {
            //点击
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //获取当前屏幕上的位置,避免插入后position不对
                    int layoutPosition = holder.getLayoutPosition();
                    onItemClickListner.onItemClick(holder.itemView, layoutPosition);
                }
            });
            //长按
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    int layoutPosition = holder.getLayoutPosition();
                    onItemClickListner.onItemLongClick(holder.itemView, layoutPosition);
                    return false;
                }
            });
        }
    }

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

    //插入数据
    public void addData(int pos) {
        dataList.add(pos, "Insert One");
//        dataList.add("Insert One");
        notifyItemInserted(pos);
    }

    //移除数据
    public void deleData(int pos) {
        dataList.remove(pos);
        notifyItemRemoved(pos);
    }

    public static class ViewHodler extends RecyclerView.ViewHolder{
        TextView textView;

        public ViewHodler(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.item_tv);
        }
    }
}

2、新建StaggActivity活动
package com.leixiansheng.test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Toast;

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

public class StaggActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private StaggAdapter adapter;
    private List<String> dataList = new ArrayList<>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
        //配置添加适配器
        adapter = new StaggAdapter(dataList);
        recyclerView.setAdapter(adapter);

        adapter.setOnItemClickListner(new RecyclerAdapter.OnItemClickListner() {
            @Override
            public void onItemClick(View view, int postion) {
                Toast.makeText(StaggActivity.this, dataList.get(postion)+"",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClick(View view, int postion) {
                adapter.deleData(postion);
            }
        });
    }

    private void initData() {
        for (int i = 0; i < 100; i++) {
            dataList.add("显示内容" + i);
        }
    }
}
别忘了注册活动!


 
 
 
 

                
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值