android listview瀑布流,Recycler 的用法(listView、gridView和瀑布流)

RecyclerView

1.特点

1.不关心Item是否显示

LayoutManager

2.不关心Item 之间如何分隔

控制分隔效果 - - ItemDecoration

下载地址https://gist.github.com/alexfu/0f464fc3742f134ccd1e

3.不关注Item增加与删除的动画效果

ItemAnimation 删除动画的效果

4.只关注如何回收和复用View

2.主要相关的几个类

Adapter

ViewHolder

LayoutManager (显示风格,(纵横)listView、gridView、瀑布流)

ItemDecoration (分隔效果)

ItemAnimation (内部Item增删的动画效果)

3.简单实用(实现listView)

3.1布局中加入RecyclerView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:id="@+id/id_recyclerView"

>

3.2ViewHolder 类

public class MySimpleAdapter extends RecyclerView.Adapter {

private LayoutInflater mInflater;

private Context mContext;

private List mDatas;

public MySimpleAdapter(Context context, List datas) {

this.mContext = context;

this.mDatas = datas;

mInflater = LayoutInflater.from(context);

}

@Override

public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

View view = mInflater.inflate(R.layout.item_single_textview,viewGroup,false);

MyViewHolder viewHolder = new MyViewHolder(view);

return viewHolder;

}

@Override

public void onBindViewHolder(MyViewHolder myViewHolder, int i) {

myViewHolder.tv.setText(mDatas.get(i));

}

@Override

public int getItemCount() {

return mDatas.size();

}

}

class MyViewHolder extends RecyclerView.ViewHolder {

// 一般会有当前item 所有的控件

TextView tv;

public MyViewHolder(View itemView) {

super(itemView);

tv = (TextView) itemView.findViewById(R.id.id_tv);

}

}

3.3 Item 布局

android:layout_width="match_parent"

android:layout_height="72dp"

android:layout_margin="3dp"

android:background="#44ff0000"

>

android:layout_width="72dp"

android:layout_height="match_parent"

android:id="@+id/id_tv"

android:gravity="center"

/>

3.4 MainActivity

public class MainActivity extends AppCompatActivity {

private RecyclerView mRecyclerView;

private List mDatas;

private MySimpleAdapter mAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initDatas();

initViews();

mAdapter = new MySimpleAdapter(this,mDatas);

mRecyclerView.setAdapter(mAdapter);

//设置RecyclerView的布局管理 //展现为listView 的Style

LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayout.VERTICAL,false);

mRecyclerView.setLayoutManager(manager);

//设置RecyclerView之间的分割线

mRecyclerView.addItemDecoration(new DividerItemDecoration(this,

DividerItemDecoration.VERTICAL_LIST));

}

private void initDatas() {

mDatas = new ArrayList();

for (int i=0;i<10;i++){

mDatas.add("miss" + i);

}

}

private void initViews() {

mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerView);

}

}

3.5 分割线(divider_02)

AAffA0nNPuCLAAAAAElFTkSuQmCC

android:shape="rectangle">

android:centerColor="#ff0000ff"

android:endColor="#ff00ff00"

android:type="linear"/>

AAffA0nNPuCLAAAAAElFTkSuQmCC

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

@drawable/divider_02

4.GridView

//gridView 展示

public void grid(View view){

mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));

}

//gridView 横向显示

public void gridh(View view){

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(5,

StaggeredGridLayoutManager.HORIZONTAL));

}

5.瀑布流

5.1 控制高度MySimpleAdapter,MyViewHolder转换成内部类

private List mHeights;

public MySimpleAdapter(Context context, List datas) {

this.mContext = context;

this.mDatas = datas;

mInflater = LayoutInflater.from(context);

mHeights = new ArrayList();

for (int i=0; i

mHeights.add((int)(100+Math.random()*300));

}

}

5.2 瀑布流

//gridView 瀑布流

public void gridh(View view){

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,

StaggeredGridLayoutManager.VERTICAL));

}

增加和删除Item的方法

Adapter里面

public void addData(int pos){

mDatas.add(pos,"insert one");

notifyItemInserted(pos);

}

public void deleteData(int pos){

mDatas.remove(pos);

notifyItemRemoved(pos);

}

方便调用

Activity中

public void add(View view){

mAdapter.addData(1);

}

public void delete(View view){

mAdapter.deleteData(1);

}

7.添加监听

7.1 在Adapter类中添加

public interface OnItemClickListener{

void onItemClick(View view,int postion);

void onItemLongClick(View view,int postion);

}

private OnItemClickListener mOnItemClickListener;

public void setOnItemClickListener(OnItemClickListener listener){

this.mOnItemClickListener = listener;

}

7.2 在onBindViewHolder

public void onBindViewHolder(final MyViewHolder myViewHolder, final int i) {

myViewHolder.tv.setText(mDatas.get(i));

if (mOnItemClickListener != null){

myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

mOnItemClickListener.onItemClick(myViewHolder.itemView,i);

}

});

//longClick

myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {

@Override

public boolean onLongClick(View view) {

mOnItemClickListener.onItemLongClick(myViewHolder.itemView,i);

return false;

}

});

}

}

7.3 监听的实现

mAdapter = new MySimpleAdapter(this,mDatas);

mRecyclerView.setAdapter(mAdapter);

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

mAdapter.setOnItemClickListener(new MySimpleAdapter.OnItemClickListener() {

@Override

public void onItemClick(View view, int postion) {

Toast.makeText(MainActivity.this, "Click:"+postion, Toast.LENGTH_SHORT).show();

}

@Override

public void onItemLongClick(View view, int postion) {

Toast.makeText(MainActivity.this, "LongClick:"+postion, Toast.LENGTH_SHORT).show();

}

});

}

7.4 存在问题,Click postion 不对,愿意:notifyInsert..()不会刷新所有的view

在点击事件之后,加入

public void onClick(View view) {

int layoutPosition = myViewHolder.getLayoutPosition();

mOnItemClickListener.onItemClick(myViewHolder.itemView,layoutPosition);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值