Android应用开发中RecyclerView组件使用入门教程

2019-12-10 18:59:34王振洲

4. LayoutManager
管理RecyclerView的布局结构.

 private void initRecyclerLayoutManager(RecyclerView recyclerView) {
  // 错列网格布局
  recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
    StaggeredGridLayoutManager.VERTICAL));
 }

提供了多种LayoutManager, 瀑布流使用错列网格布局.
5. Adapter
适配器, 处理RecyclerView的Item事务.

 private void initRecyclerAdapter(RecyclerView recyclerView) {
  mAdapter = new MyAdapter(getData());
  recyclerView.setAdapter(mAdapter);
 }

对于Adapter, 我们需要展开来说, 先看看类.

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

 private List<DataModel> mDataModels;
 private List<Integer> mHeights;

 MyAdapter(List<DataModel> dataModels) {
  if (dataModels == null) {
   throw new IllegalArgumentException("DataModel must not be null");
  }
  mDataModels = dataModels;
  mHeights = new ArrayList<>();
 }

 @Override
 public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View itemView = LayoutInflater.from(parent.getContext())
    .inflate(R.layout.item_recycler_view, parent, false);
  return new MyViewHolder(itemView);
 }

 @Override
 public void onBindViewHolder(MyViewHolder holder, int position) {
  DataModel dataModel = mDataModels.get(position);

  // 随机高度, 模拟瀑布效果.
  if (mHeights.size() <= position) {
   mHeights.add((int) (100 + Math.random() * 300));
  }

  ViewGroup.LayoutParams lp = holder.getTvLabel().getLayoutParams();
  lp.height = mHeights.get(position);

  holder.getTvLabel().setLayoutParams(lp);

  holder.getTvLabel().setText(dataModel.getLabel());
  holder.getTvDateTime().setText(new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH)
    .format(dataModel.getDateTime()));
 }

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

 public void addData(int position) {
  DataModel model = new DataModel();
  model.setDateTime(getBeforeDay(new Date(), position));
  model.setLabel("No. " + (int) (new Random().nextDouble() * 20.0f));

  mDataModels.add(position, model);
  notifyItemInserted(position);
 }

 public void removeData(int position) {
  mDataModels.remove(position);
  notifyItemRemoved(position);
 }

 /**
  * 获取日期的前一天
  *
  * @param date 日期
  * @param i 偏离
  * @return 新的日期
  */
 private static Date getBeforeDay(Date date, int i) {
  Calendar calendar = Calendar.getInstance();
  calendar.setTime(date);
  calendar.add(Calendar.DAY_OF_YEAR, i * (-1));
  return calendar.getTime();
 }
}