Recyclerview瀑布流效果
阿新 • • 發佈:2019-01-06
新增依賴,如上文
public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.MyHolder> { private Context context; private ArrayList<String> list; private List<Integer> random_nums;//放隨機數 private OnRecyclerItemClickListener mOnItemClickListener;//單擊事件 private onRecyclerItemLongClickListener mOnItemLongClickListener;//長按事件 public RecycleAdapter(Context context, ArrayList<String> list) { this.context = context; this.list = list; //記錄為每個控制元件產生的隨機高度,避免滑到頂部出現空白 random_nums=new ArrayList<>(); for (int i = 0; i < list.size(); i++) { int random=new Random().nextInt(200)+100; random_nums.add(random); } } @NonNull @Override public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view=LayoutInflater.from(context).inflate(R.layout.recycle_item,viewGroup,false); return new MyHolder(view); } @Override public void onBindViewHolder(@NonNull final MyHolder myHolder, int i) { //填充資料 myHolder.textView.setText(list.get(i)); //由於需要實現瀑布流的效果,所以需要動態的改變控制元件的高度 ViewGroup.LayoutParams params=myHolder.textView.getLayoutParams(); params.height=random_nums.get(i); myHolder.textView.setLayoutParams(params); //設定點選事件 if (mOnItemClickListener!=null){ myHolder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //這裡是為textView設定了單擊事件,回調出去 //mOnItemClickListener.onItemClick(v,position);這裡需要獲取佈局中的position,不然亂序 mOnItemClickListener.onItemClick(v,myHolder.getLayoutPosition()); } }); } if(mOnItemLongClickListener != null){ myHolder.textView.setOnLongClickListener(new View.OnLongClickListener() { /** * @param v * @return */ @Override public boolean onLongClick(View v) { //回調出去 mOnItemLongClickListener.onItemLongClick(v,myHolder.getLayoutPosition()); return true;//不返回true,鬆手還會去執行單擊事件 } }); } } @Override public int getItemCount() { return list.size(); } class MyHolder extends RecyclerView.ViewHolder{ TextView textView; public MyHolder(@NonNull View itemView) { super(itemView); textView=itemView.findViewById(R.id.text); } } /** * 處理item的點選事件,自定義介面回撥 */ interface OnRecyclerItemClickListener { public void onItemClick(View view, int position); } /** * 長按事件 */ interface onRecyclerItemLongClickListener{ public void onItemLongClick(View view, int position); } public void setOnItemClickListener(OnRecyclerItemClickListener onItemClickListener){ mOnItemClickListener = onItemClickListener; } public void setmOnItemLongClickListener(onRecyclerItemLongClickListener onItemLongClickListener){ mOnItemLongClickListener=onItemLongClickListener; } //向指定位置新增元素 public void addItem(int position,String value){ if (position>list.size()){ position=list.size(); } if (position<0){ position=0; } /** * 使用notifyItemInserted/notifyItemRemoved會有動畫效果 * 而使用notifyDataSetChanged()則沒有 */ list.add(position,value);//在集合中新增這條資料 random_nums.add(position,new Random().nextInt(200)+100);//新增一個隨機高度,會在onBindViewHolder方法中得到設定 notifyItemInserted(position);//通知插入了資料元素 } //移除指定位置元素 public String removeItem(int position){ if (position>list.size()-1){ return null; } random_nums.remove(position);//刪除新增的高度 String value=list.remove(position);//在手動集合中刪除一次 notifyItemRemoved(position);//通知刪除了資料,但是沒有刪除list集合中的資料 return value; } } public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private ArrayList<String> mlist; private RecycleAdapter recycleAdapter; /** * @param savedInstanceState */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView=findViewById(R.id.recycleView); //宣告為瀑布流的佈局方式 StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL); //為recycleview設定佈局管理器 recyclerView.setLayoutManager(staggeredGridLayoutManager); //初始化資料 initData(); //初始化介面卡 recycleAdapter=new RecycleAdapter(this,mlist); recyclerView.setItemAnimator(new DefaultItemAnimator()); //設定介面卡 recyclerView.setAdapter(recycleAdapter); //自定義分割線並新增 DividerItemDecoration decoration=new DividerItemDecoration(this,DividerItemDecoration.VERTICAL); decoration.setDrawable(ContextCompat.getDrawable(this,R.drawable.divied)); recyclerView.addItemDecoration(decoration); DividerItemDecoration decoration1=new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL); decoration1.setDrawable(ContextCompat.getDrawable(this,R.drawable.divied)); recyclerView.addItemDecoration(decoration1); //重新整理介面卡 recycleAdapter.notifyDataSetChanged(); //新增點選事件 recycleAdapter.setOnItemClickListener(new RecycleAdapter.OnRecyclerItemClickListener() { /** * @param view * @param position */ @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this,"單擊了:"+mlist.get(position),Toast.LENGTH_SHORT).show(); recycleAdapter.addItem(position,"新增內容"); Log.i("tag","onItemClick:"+position); Log.i("tag","集合:"+mlist.toString()); } }); //設定長按事件 recycleAdapter.setmOnItemLongClickListener(new RecycleAdapter.onRecyclerItemLongClickListener() { /** * @param view * @param position */ @Override public void onItemLongClick(View view, int position) { Toast.makeText(MainActivity.this,"長按了:"+mlist.get(position),Toast.LENGTH_SHORT).show(); recycleAdapter.removeItem(position); Log.i("tag", "onItemLongClick: "+position); Log.i("tag", "集合: "+mlist.toString()); } }); } //初始化資料 private void initData() { mlist=new ArrayList<>(); for (int i = 'A'; i <='Z' ; i++) { mlist.add((char)i+""); } } }