RecyclerView的使用已经非常普遍了,但是因为习惯问题还是一直使用ListView,然后啊,仔细一想还得学习新东西啊,然后就试着使用了RecyclerView了,挺好用,adapter的写法稍有不同,写出来记录一下吧。
首先看一下普通RecyclerView的adapter的写法:
/** * 项目名称: * Created on 2018/2/28 0028. * 重写Adapter,继承自RecyclerView的Adapter * @author cuihw */ public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{ private Context context; private List<WorkResult> workResultList; public WorkItemAdapter( List<WorkResult> workResultList) { if (workResultList!=null) { this.workResultList = workResultList; }else { workResultList=new ArrayList<>(); } notifyDataSetChanged(); } /** * item显示类型 * * @param parent * @param viewType * @return */ @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (context==null){ context=parent.getContext(); } LayoutInflater layoutInflater=LayoutInflater.from(context); View view=layoutInflater.inflate(R.layout.module_list_item_simple_text,parent,false); ViewHolder viewHolder=new ViewHolder(view); return viewHolder; } /** * 数据的绑定显示 * * @param holder * @param position */ @Override public void onBindViewHolder(ViewHolder holder, int position) { WorkResult workResult=workResultList.get(position); holder.tvName.setText(workResult.getName()); } @Override public int getItemCount() { return workResultList.size(); } /** * ViewHolder类,继承自RecyclerView的ViewHolder */ public class ViewHolder extends RecyclerView.ViewHolder { public TextView tvName; public ViewHolder(View itemView) { super(itemView); tvName=itemView.findViewById(R.id.model_list_item_simple_textView); } } }
以上是一个简单的RecyclerViewAdapter的写法,但是实际操作中,我们经常会遇到比如“上拉加载更多”、“下拉刷新数据”的需求,那么,我们的Adapter就要做更多的事情了,代码如下:
public class KeyAptitudeConfirmAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<KeyAptitudeListEntity> list; //定义价格状态码 //上拉加载更多 public static final int PULLUP_LOAD_MORE = 0; //正在加载中 public static final int LOADING_MORE = 1; //加载完成 public static final int LOADING_END = 2; //上拉加载更多状态-默认为0 private int load_more_status = 0; private LayoutInflater mInflater; private static final int TYPE_ITEM = 0; //普通Item View private static final int TYPE_FOOTER = 1; //顶部FootView public KeyAptitudeConfirmAdapter(Context context, List<KeyAptitudeListEntity> mList) { this.context = context; if (list != null) { this.list = mList; } else { list = new ArrayList<>(); } notifyDataSetChanged(); } /** * item显示类型 * * @param parent * @param viewType * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { mInflater = LayoutInflater.from(context); //进行判断显示类型,来创建返回不同的View if (viewType == TYPE_ITEM) { View view = mInflater.inflate(R.layout.key_attribute_identify_item, parent, false); //这边可以做一些属性设置,甚至事件监听绑定 //view.setBackgroundColor(Color.RED); ItemViewHolder itemViewHolder = new ItemViewHolder(view); return itemViewHolder; } else if (viewType == TYPE_FOOTER) { View footView = mInflater.inflate(R.layout.foot_view, parent, false); //这边可以做一些属性设置,甚至事件监听绑定 //view.setBackgroundColor(Color.RED); FootViewHolder footViewHolder = new FootViewHolder(footView); return footViewHolder; } return null; } /** * 数据的绑定显示 * * @param holder * @param position */ @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ItemViewHolder) { final KeyAptitudeListEntity entity = list.get(position); final ItemViewHolder itemViewHolder = (ItemViewHolder) holder; itemViewHolder.tvSignDate.setText(entity.getSignDate()); itemViewHolder.tvName.setText(entity.getProjectName()); itemViewHolder.tvUploadDate.setText(entity.getUploadDate()); itemViewHolder.tvForMore.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int position = itemViewHolder.getAdapterPosition(); Intent intent = new Intent(context, KeyAptitudeDetailActivity.class); // intent.putExtra("type", entity.getStatus()); intent.putExtra("id", list.get(position).getId()); context.startActivity(intent); } }); } else if (holder instanceof FootViewHolder) { FootViewHolder footViewHolder = (FootViewHolder) holder; switch (load_more_status) { case PULLUP_LOAD_MORE: footViewHolder.llContainer.setVisibility(View.VISIBLE); footViewHolder.item_tv.setText("上拉加载更多..."); break; case LOADING_MORE: footViewHolder.llContainer.setVisibility(View.VISIBLE); footViewHolder.item_tv.setText("正在加载更多数据..."); break; case LOADING_END: footViewHolder.llContainer.setVisibility(View.GONE); } } } /** * 进行判断是普通Item视图还是FootView视图 * * @param position * @return */ @Override public int getItemViewType(int position) { // 最后一个item设置为footerView if (position + 1 == getItemCount()) { return TYPE_FOOTER; } else { return TYPE_ITEM; } } /** * 获取条目数 * @return */ @Override public int getItemCount() { if (list.size()==0){ return list.size(); }else { return list.size() + 1; } } /** * 自定义的ItemViewHolder,持有每个Item的的所有界面元素 */ public static class ItemViewHolder extends RecyclerView.ViewHolder { public View proNeedView; public TextView tvName; public TextView tvSignDate; public TextView tvUploadDate; public TextView tvForMore; public ItemViewHolder(View itemView) { super(itemView); proNeedView = itemView; tvName = (TextView) itemView.findViewById(R.id.key_aptitude_name); tvSignDate = (TextView) itemView.findViewById(R.id.key_aptitude_signDate); tvUploadDate = (TextView) itemView.findViewById(R.id.key_aptitude_uploadDate); tvForMore = (TextView) itemView.findViewById(R.id.key_aptitude_more); } } /** * 底部FootView布局 * 当滑动到页面最底端是加载此布局 */ public static class FootViewHolder extends RecyclerView.ViewHolder { public TextView item_tv; public LinearLayout llContainer; public FootViewHolder(View view) { super(view); item_tv = (TextView) view.findViewById(R.id.textView1); llContainer = (LinearLayout) view.findViewById(R.id.footView_container); } } /** * 下拉刷新数据 * * @param newDatas */ public void refreshItem(List<KeyAptitudeListEntity> newDatas) { list.removeAll(list); list.addAll(newDatas); notifyDataSetChanged(); } /** * 加载更多数据 * @param newDatas */ public void addMoreItem(List<KeyAptitudeListEntity> newDatas) { list.addAll(newDatas); notifyDataSetChanged(); } /** * //上拉加载更多 * PULLUP_LOAD_MORE=0; * //正在加载中 * LOADING_MORE=1; * //加载完成已经没有更多数据了 * NO_MORE_DATA=2; * * @param status */ public void changeMoreStatus(int status) { load_more_status = status; notifyDataSetChanged(); } }
好吧,编辑了半天发布的时候后边的居然丢了,只能重写写后边的了,后边其实内容也不多了,就是大概展示一下布局文件及activity中代码的展示。代码如下:
布局代码(activty_key.xml):
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/key_aptitude_swipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/lv_key_aptitude" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout> </FrameLayout>
activity中的代码显示:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_key); ButterKnife.bind(this); list = new ArrayList<>(); swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { getData(page, number,REFRESH); } }); linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); listView.setLayoutManager(linearLayoutManager); adapter = new MyAdapter(this, list); listView.setAdapter(adapter); lvKeyAptitude.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) { adapter.changeMoreStatus(MyAdapter.LOADING_MORE);//改变状态 page++; getData(page, number,GET_MORE); } } }); getData(page, number,REFRESH); }好了,到此结束,后续再有新的心得我会继续更新