Android RecyclerViewStickyHeaders 使用Demo
16lz
2021-01-23
1。使用添加依赖lib
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
更多相关文章
- AndEngine添加多个动画精灵的方法
- Android arm模拟器的速度提升方法
- android保存第一次安装状态并初始化数据
- Android getResources().getColor() 过时 替代方法111
- Android点击事件方法
- Android的数据过滤机制
- android使用HTTP协议读取数据
- canvas.drawRoundRect方法,绘制圆角矩形
- android升级数据库(Sqlite)简单示例