Android RecyclerViewStickyHeaders 使用Demo
2016-04-12 15:32
375 查看
1。使用添加依赖lib
2。MainActivity
3。RecyclerViewAdapterWithHeader
效果
demo:https://github.com/louisgeek/LouisRecyclerViewStickyHeadersDemo
2。MainActivity
package com.louisgeek.louisrecyclerviewstickyheadersdemo; 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 android.widget.TextView; import android.widget.Toast; import com.eowise.recyclerview.stickyheaders.OnHeaderClickListener; import com.eowise.recyclerview.stickyheaders.StickyHeadersBuilder; import com.eowise.recyclerview.stickyheaders.StickyHeadersItemDecoration; public class MainActivity extends AppCompatActivity implements OnHeaderClickListener { private StickyHeadersItemDecoration topStickyHeadersItemDecoration; RecyclerViewAdapterWithHeader recyclerViewAdapterWithHeader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = (RecyclerView)findViewById(R.id.id_rv); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerViewAdapterWithHeader= new RecyclerViewAdapterWithHeader(this); recyclerViewAdapterWithHeader.setOnItemClickListener(new RecyclerViewAdapterWithHeader.OnItemClickListener() { @Override public void onItemClick(int position, Object object) { //Toast.makeText(MainActivity.this, "Click on item" + position + ";object:" + object.toString(), Toast.LENGTH_SHORT).show(); //##recyclerViewAdapterWithHeader.addItem(position, "新增数据=点到的是" + position); } @Override public void onItemLongClick(int position, Object object) { // Toast.makeText(MainActivity.this, "Click long on item" + position + ";object:" + object.toString(), Toast.LENGTH_SHORT).show(); recyclerViewAdapterWithHeader.deleteItem(position); } }); topStickyHeadersItemDecoration= new StickyHeadersBuilder() .setAdapter(recyclerViewAdapterWithHeader) .setRecyclerView(recyclerView) .setOnHeaderClickListener(this) .build(); recyclerView.addItemDecoration(topStickyHeadersItemDecoration); } @Override public void onHeaderClick(View header, long headerId) { TextView textView= (TextView) header.findViewById(R.id.id_tv_head_item); Toast.makeText(this, "Click on headerId:" +headerId+";textView="+textView.getText(), Toast.LENGTH_SHORT).show(); } }
3。RecyclerViewAdapterWithHeader
package com.louisgeek.louisrecyclerviewstickyheadersdemo; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.eowise.recyclerview.stickyheaders.StickyHeadersAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class RecyclerViewAdapterWithHeader extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements StickyHeadersAdapter<RecyclerView.ViewHolder> { private Context mContext; private OnItemClickListener listener; private List<Map<String, Object>> mapList = new ArrayList<>(); private List<String> tempItems = new ArrayList<>(); private LinkedHashMap<String, Boolean> linkedHashMap; public RecyclerViewAdapterWithHeader(Context context) { this.mContext = context; /* String[] countries =mContext.getResources().getStringArray(R.array.countries_cn); listStr=Arrays.asList(countries);*/ for (int i = 0; i < 3; i++) { Map<String, Object> map = new HashMap<>(); map.put("name", "AA" + i); mapList.add(map); } for (int i = 0; i < 5; i++) { Map<String, Object> map = new HashMap<>(); map.put("name", "BB" + i); mapList.add(map); } for (int i = 0; i < 8; i++) { Map<String, Object> map = new HashMap<>(); map.put("name", "CC" + i); mapList.add(map); } //2016年4月12日10:41:08 setHasStableIds(true); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = (View) LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { final MyViewHolder myViewHolder = (MyViewHolder) holder; //final int realPosition=myViewHolder.getPosition(); myViewHolder.mTextView.setText(mapList.get(position).get("name").toString() + " pos:" + position); myViewHolder.mTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (null != listener) { listener.onItemClick(position, mapList.get(position)); } } }); myViewHolder.mTextView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (null != listener) { listener.onItemLongClick(position, mapList.get(position)); } return false; } }); } @Override public int getItemCount() { return mapList.size(); } //必须重写 不然item会错乱 @Override public long getItemId(int position) { //return super.getItemId(position); // return countries[position].hashCode(); return position; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_header, parent, false); return new MyHeaderViewHolder(itemView); } @Override public void onBindHeaderViewHolder(RecyclerView.ViewHolder viewHolder, int position) { MyHeaderViewHolder myHeaderViewHolder = (MyHeaderViewHolder) viewHolder; myHeaderViewHolder.title.setText(mapList.get(position).get("name").toString().subSequence(0, 1) + " pos:" + position); //headerViewHolder.title.setText(countries[position].subSequence(0, 1)); } @Override public long getHeaderId(int position) { /* if (position<3){ return 0; }else if (position<5){ return 1; }else if (position<8){ return 2; }else { return 3; }*/ return mapList.get(position).get("name").toString().subSequence(0, 1).hashCode(); } public class MyViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public MyViewHolder(View view) { super(view); mTextView = (TextView) view.findViewById(R.id.id_tv_item); } } public static class MyHeaderViewHolder extends RecyclerView.ViewHolder { TextView title; public MyHeaderViewHolder(View itemView) { super(itemView); title = (TextView) itemView.findViewById(R.id.id_tv_head_item); } } void addItem(int position, Object object) { Map<String, Object> map = new HashMap<>(); map.put("name", "新的数据" + position); mapList.add(position, map); //notifyDataSetChanged(); notifyItemInserted(position); } void deleteItem(int position) { mapList.remove(position); //暂时解决RecyclerView删除第一项报错问题 IndexOutOfBoundsException Invalid item position if (position == 0) { notifyDataSetChanged(); } else { notifyItemRemoved(position); } //后来发现https://github.com/lucasr/twoway-view/issues/134 有同样的问题 2016-4-12 20:10:49 } /** * 内部接口回调方法 */ public interface OnItemClickListener { void onItemClick(int position, Object object); void onItemLongClick(int position, Object object); } /** * 设置监听方法 * * @param listener */ public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } }
效果
demo:https://github.com/louisgeek/LouisRecyclerViewStickyHeadersDemo
相关文章推荐
- android中listview分页加载数据
- Android 崩溃报错捕捉,并且友好提示!(不是CrashHandler)
- Android应用坐标系统全面详解
- Android在线支付
- Android TypedArray详情
- RxAndroid的初体验
- Android屏幕适配全攻略(最权威的官方适配指导)
- android 动画详解(二)
- android 多线程断点续传下载 三
- Android的debug.keystore拒绝访问导致的生成异常及解决方案
- Android学习之Android本地存储的五种方式
- 自定义progressbar的宽度和颜色
- android开发问题
- Android 最火的快速开发框架androidannotations配置详解
- Android文件管理
- Android Studio设置或修改Android SDK路径
- 有米Android SDK 实用工具
- 《Android源码设计模式》读书笔记 (21) 第21章 装饰模式
- Android实现Service后台下载Notification进度条
- android-tools-adb