使用RecyclerView实现瀑布流的效果

主函数:java

public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private List<String> dataList  = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件
       recyclerView = (RecyclerView) findViewById(R.id.recyclerView); //初始化数据
 initData(); //设置瀑布流的布局方式,参数一:3列 参数二:垂直方向
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL); //为recyclerView设置布局管理器
 recyclerView.setLayoutManager(staggeredGridLayoutManager); //建立适配器
        final MyRecyclerViewAdapter myRecyclerViewAdapter =new MyRecyclerViewAdapter(this,dataList); //设置适配器
 recyclerView.setAdapter(myRecyclerViewAdapter); //自定义监听
        myRecyclerViewAdapter.setOnItemCickListener(new MyRecyclerViewAdapter.MyOnItemClickListener() { @Override public void myOnItemClickListener(int position, View view) { Toast.makeText(MainActivity.this, "点击了第"+position+"条", Toast.LENGTH_SHORT).show(); myRecyclerViewAdapter.deleteData(position); } }); myRecyclerViewAdapter.setOnLongCickListener(new MyRecyclerViewAdapter.MyOnLongClickListener() { @Override public void myOnLongClickListener(int position, View view) { myRecyclerViewAdapter.addData(position,"我是新来的"); } }); } private void initData() { for (int i = 0; i < 30; i++) { dataList.add(i+""); } } }

MyRecycleViewAdapter:android

package fanggao.qf.recyclerstaggredgridview01;

import android.content.Context;
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;
import java.util.Random;

/**
 * Created by Administrator on 2016/9/28.
 */
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
    private Context context;
    private List<String> dataList ;
    private int random;
    private List<Integer>heightList = new ArrayList<Integer>();
    private MyOnItemClickListener myOnItemClcikListener;
    private MyOnLongClickListener myOnLongClickListener;

    public MyRecyclerViewAdapter(Context context, List<String> dataList) {
        this.context = context;
        this.dataList = dataList;
        //初始化高度
        if(dataList != null&&dataList.size() != 0){
            for (int i = 0; i < dataList.size(); i++) {
                random = new Random().nextInt(200)+100;//[100,300)
                heightList.add(random);
            }
        }
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //加载布局
        View inflate = LayoutInflater.from(context).inflate(R.layout.recyclerview_item, parent,false);
        //将布局传入viewholder并返回给onBindViewHolder
        return new MyViewHolder(inflate);
    }

    /**
     * 该方法相似与listview中的getView方法,每次加载视图的时候都会调用,可是这里给了每一个item随机的高度,所以当屏幕复用时,
     * 会不断复用不一样的高度,当屏幕滑到顶部时,会由于高度不等产生大片空白,而后回到初始状态,所以,须要给每一个item记录高度,
     * 将其存到集合,每次调用该item时,设置高度
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        holder.text.setText(dataList.get(position));
        //设置高度
        int height = heightList.get(position);
        //获得控件的高度
        ViewGroup.LayoutParams layoutParams = holder.text.getLayoutParams();
        //设置高度
        layoutParams.height = height;
        //设置点击事件
        if(myOnItemClcikListener != null && !holder.text.hasOnClickListeners()){
            holder.text.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //回调方法,,将view控件和索引传回,索引必须是布局在父布局中的索引,不然索引错乱最终报错
                    myOnItemClcikListener.myOnItemClickListener(holder.getLayoutPosition(),v);
                }
            });
        }
        if(myOnLongClickListener != null ){
            holder.text.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    myOnLongClickListener.myOnLongClickListener(holder.getLayoutPosition(),v);
                    return true;
                }
            });
        }


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

    public void deleteData(int position) {
        //使用notifyItemInserted/notifyItemRemoved会有动画效果
        // 而使用notifyDataSetChanged()则没有
        heightList.remove(position);
        dataList.remove(position);
        notifyItemRemoved(position);
    }
    public void addData(int position,String str){
        dataList.add(position,str);
        int random = new Random().nextInt(200)+100;
        heightList.add(position,random);
        notifyItemInserted(position);
    }

    //注意:该类是公共的,否则适配器设置设置泛型失败
  public class MyViewHolder extends RecyclerView.ViewHolder{
        private TextView text;
        public MyViewHolder(View itemView) {
            super(itemView);
            text = (TextView) itemView.findViewById(R.id.tv_text);
        }
    }
    //对外暴露的方法,当设置该方法时,会建立接口的实现类
    public void setOnItemCickListener(MyOnItemClickListener myOnItemClickListener){
        this.myOnItemClcikListener = myOnItemClickListener;
    }
    public void setOnLongCickListener(MyOnLongClickListener myOnLongClickListener){
        this.myOnLongClickListener = myOnLongClickListener;
    }
    //自定义点击接口
    public interface MyOnItemClickListener{
        void myOnItemClickListener(int position,View view);
    }
    //自定义长按接口
    public interface MyOnLongClickListener{
        void myOnLongClickListener(int position,View view);
    }
}

dom

 

 

 

果:ide

相关文章
相关标签/搜索