RecycleView的使用
参考网上资料 做了一个DEMO
不得不说 这recycleView用起来真麻烦。
可以添加头布局 和 脚布局,带有点击效果的RecycleView。
RecycleViewActivity中的mData 和 RecycleAdapter 中的 mData数据互通,改变其中一个 另一个页面的数据也会改变。增加数据的时候 带有动画效果
可以点击整个item 也可以点击 item中间的字母
public class RecycleViewActivity extends Activity implements RecycleAdapter.OnRecyclerViewItemClickListener, View.OnClickListener {
private WarpRecycleView recyclerView;
private List<String> mData;
private RecycleAdapter adapter;
private View headView;
private ImageView header;
private Button addDatasData1;
private Button addDatasData2;
private Button addDatasData3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_recycle);
initView();
initData();
initListener();
}
private void initView() {
recyclerView = (WarpRecycleView) findViewById(R.id.recycleView);
addDatasData1 = (Button) findViewById(R.id.addDatasData1);
addDatasData2 = (Button) findViewById(R.id.addDatasData2);
addDatasData3 = (Button) findViewById(R.id.addDatasData3);
headView = View.inflate(this, R.layout.headview,null);
RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,300);
headView.setLayoutParams(params);
}
private void initData() {
mData = new ArrayList<String>();
for(int i='A'; i<='Z'; i++){
mData.add(String.valueOf((char)i));
}
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.addHeadView(headView);
adapter = new RecycleAdapter(this,mData);
recyclerView.setAdapter(adapter);
}
private void initListener() {
adapter.setOnItemClickListener(this);
addDatasData1.setOnClickListener(this);
addDatasData2.setOnClickListener(this);
addDatasData3.setOnClickListener(this);
}
@Override
public void onItemClick(View view, int position, int type) {
if(type == 0){
Toast.makeText(RecycleViewActivity.this,"点击了整个item",Toast.LENGTH_SHORT).show();
}else if(type == 1){
Toast.makeText(RecycleViewActivity.this,mData.get(position),Toast.LENGTH_SHORT).show();
}
}
@Override
public void onClick(View v) {
if(v == addDatasData1){
mData.add(0, "1");
adapter.addDataHead();
recyclerView.scrollToPosition(0);
}else if(v == addDatasData2){
mData.add(mData.size(), "1");
adapter.addDataFoot();
recyclerView.scrollToPosition(mData.size()-1);
}else if(v == addDatasData3){
adapter.moveData();
}
}
}
public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.RecycleViewHolder> {
private Context context;
private List<String> mData;
private LayoutInflater mLayoutInflater;
private OnRecyclerViewItemClickListener mOnItemClickListener = null;
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
this.mOnItemClickListener = listener;
}
/**
* type==0 点击整个item
* type==1 点击英文字母
*/
public interface OnRecyclerViewItemClickListener {
void onItemClick(View view , int position,int type);
}
public RecycleAdapter(Context context, List<String> mData){
this.context = context;
this.mData = mData;
mLayoutInflater = LayoutInflater.from(context);
}
public void notifyData(List<String> mData){
// this.mData = mData;
// this.mData.add(0, "1");
// notifyItemChanged(1);
mData.addAll(mData);
notifyItemInserted(mData.size()-5);
}
public void addDataHead(){
notifyItemInserted(0);
}
public void addDataFoot(){
notifyItemInserted(mData.size());
}
public void moveData(){
notifyItemMoved(1,2);
}
@Override
public RecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(R.layout.base_item,parent,false);
return new RecycleViewHolder(view);
}
@Override
public void onBindViewHolder(RecycleViewHolder holder, int position) {
holder.itemtv.setText(mData.get(position));
}
@Override
public int getItemCount() {
if(mData==null)return 0;
return mData.size();
}
class RecycleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView itemtv;
public RecycleViewHolder(View itemView) {
super(itemView);
itemtv = (TextView) itemView.findViewById(R.id.tv_item);
itemView.setOnClickListener(this);
itemtv.setOnClickListener(this);
}
// getPosition() 是ViewHolder内置方法
@Override
public void onClick(View v) {
if(v == itemtv){
mOnItemClickListener.onItemClick(v,getPosition(),1);
}else if(v == itemView){
mOnItemClickListener.onItemClick(v,getPosition(),0);
}
}
}
}
public class WarpRecycleView extends RecyclerView {
private Adapter mAdapter;
private ArrayList<View> mHeaderViewInfos = new ArrayList<View>();
private ArrayList<View> mFooterViewInfos = new ArrayList<View>();
public WarpRecycleView(Context context) {
super(context);
}
/**
* XML文件中使用s
* @param context
* @param attrs
*/
public WarpRecycleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public WarpRecycleView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setAdapter(Adapter mAdapter){
if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);
super.setAdapter(mAdapter);
} else {
super.setAdapter(mAdapter);
}
this.mAdapter = mAdapter;
}
/**
* 添加头布局
* @param headView
*/
public void addHeadView(View headView){
mHeaderViewInfos.add(headView);
// 重新装饰mAdapter
if(mAdapter !=null){
if(!(mAdapter instanceof HeaderViewListAdapter)){
mAdapter = new HeaderViewListAdapter(mHeaderViewInfos,mFooterViewInfos,mAdapter);
}
}
}
/**
* 添加脚布局
* @param footView
*/
public void addFootView(View footView){
mFooterViewInfos.add(footView);
// 重新装饰mAdapter
if(mAdapter !=null){
if(!(mAdapter instanceof HeaderViewListAdapter)){
mAdapter = new HeaderViewListAdapter(mHeaderViewInfos,mFooterViewInfos,mAdapter);
}
}
}
}