当前位置: 代码迷 >> 综合 >> 不带头部带尾的单列的recyclerView(基本就跟lv一样)
  详细解决方案

不带头部带尾的单列的recyclerView(基本就跟lv一样)

热度:39   发布时间:2023-10-15 09:46:07.0

   我只学习着别人的rcv使用demo来学习的。所以这个只能算是转载的。。。

  下面贴的adapter是一个baseAdapter,用起来特别方便。继承他之后就写几行代码就相当于一个不带头不带尾的listView了。


import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;import java.util.ArrayList;
import java.util.List;/*** Created by cy on 2017/9/12 0012 14:12* rcv单列的baseAdapter,差不多就是lv的作用*/public abstract class RcvSingleRowBaseAdapter<T> extends RecyclerView.Adapter<SuperViewHolder> {protected List<T> mList = new ArrayList<>();public RcvSingleRowBaseAdapter() {}@Overridepublic SuperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {if (setLayout() instanceof Integer) {View view = View.inflate(parent.getContext(), ((Integer) setLayout()), null);return new SuperViewHolder(view);} else if (setLayout() instanceof View) {return new SuperViewHolder(((View) setLayout()));}return null;}@Overridepublic void onBindViewHolder(SuperViewHolder holder, int position) {onBindItemHolder(holder, position);}//局部刷新关键:带payload的这个onBindViewHolder方法必须实现@Overridepublic void onBindViewHolder(SuperViewHolder holder, int position, List<Object> payloads) {if (payloads.isEmpty()) {onBindViewHolder(holder, position);} else {onBindItemHolder(holder, position, payloads);}}public abstract Object setLayout();public abstract void onBindItemHolder(SuperViewHolder holder, int position);public void onBindItemHolder(SuperViewHolder holder, int position, List<Object> payloads) {}@Overridepublic int getItemCount() {return mList.size();}public void setDataList(ArrayList<T> entities) {this.mList.clear();this.mList.addAll(entities);notifyDataSetChanged();}public List<T> getDataList() {return this.mList;}public void addList(ArrayList<T> entities) {int lastIndex = this.mList.size();if (this.mList.addAll(entities)) {notifyItemRangeInserted(lastIndex, entities.size());}}public void remove(int position) {if (position >= this.mList.size()) {
//            Log.i("RcvSingleRowBaseAdapter", "该position超过了集合最大索引");} else {this.mList.remove(position);//移除数据源notifyItemRemoved(position);//动画//下面这两行是进行重新在remove之后防止后面的数据错乱而重新onBindViewHolderif (position != (getDataList().size())) { // 如果移除的是最后一个,忽略notifyItemRangeChanged(position, this.mList.size() - position);} else {//移除是最后一个,后面没有数据,不需要进行onBind来防止数据错乱}}}public void clear() {this.mList.clear();notifyDataSetChanged();}public void insert(int position, T entity) {}public void add(T entity) {}
}

ViewHolder是一个公共的ViewHolder:

import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;/*** Created by cy on 2017/9/12 0012 14:21* rcv viewHolder的基类*/public class SuperViewHolder extends RecyclerView.ViewHolder {private SparseArray<View> views;public SuperViewHolder(View itemView) {super(itemView);this.views = new SparseArray<>();}@SuppressWarnings("unchecked")public <T extends View> T getView(int viewId) {View view = views.get(viewId);if (view == null) {view = itemView.findViewById(viewId);views.put(viewId, view);}return (T) view;}
}

下面我贴出用法:

 (1)继承这个adapter:

 

import android.widget.TextView;/*** Created by cy on 2017/9/13 0013 14:13*/public class TestAdapter extends RcvSingleRowBaseAdapter {@Overridepublic Object setLayout() {return R.layout.item_layout;}@Overridepublic void onBindItemHolder(SuperViewHolder holder, int position) {TextView titleTv = holder.getView(R.id.item_tv);titleTv.setText(((ItemEntity) mList.get(position)).title);}
}

(2)使用这个继承的testAdapter

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {private ArrayList<ItemEntity> itemEntities = new ArrayList<>();private TestAdapter mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);RecyclerView mRcv = (RecyclerView) findViewById(R.id.rcv);setupData();mRcv.setLayoutManager(new LinearLayoutManager(this));mAdapter = new TestAdapter();mRcv.setAdapter(mAdapter);}private void setupData() {for (int i = 0; i < 28; i++) {ItemEntity entity = new ItemEntity();entity.title = "title" + i;itemEntities.add(entity);}}public void insert(View view) {mAdapter.setDataList(itemEntities);}public void addOne(View view) {ItemEntity entity = new ItemEntity();entity.title = "cy_add";mAdapter.add(entity);}public void insertOne(View view) {ItemEntity entity = new ItemEntity();entity.title = "cy_insert";mAdapter.insert(14, entity);}public void addMap(View view) {ItemEntity entity = new ItemEntity();entity.title = "cy_add_map";ItemEntity entity2 = new ItemEntity();entity2.title = "cy_add_map2";ArrayList<ItemEntity> itemEntities = new ArrayList<>();itemEntities.add(entity);itemEntities.add(entity2);mAdapter.addList(itemEntities);}public void removeOne(View view) {mAdapter.remove(20);}public void clear(View view) {mAdapter.clear();}
}

ItemEntity我就不贴出来了,还有一些基本的xml也没什么特别的地方。