android中仿<饿了么>listview与stickylistheaderslistview联动
来源:互联网 发布:意大利签证 知乎 编辑:程序博客网 时间:2024/05/21 18:08
这里主要是以项目为例:(代码注释写的很清楚):GoodsFragment.java
public class GoodsFragment extends BaseFragment implements AdapterView.OnItemClickListener, AbsListView.OnScrollListener { @InjectView(R.id.slh) StickyListHeadersListView mSlh; @InjectView(R.id.lv) ListView mLv; private MyGroupAdapter groupAdapter; private MyHeadAdapter headAdapter; //普通条目的测试数据 private List<Data> dataList = new ArrayList<>(); class Data { String info; int headId; //进行分组操作,同组数据该字段相同 int headIndex; //当前条目对应的头数据所在集合的index下标 } //头的测试数据 private List<Head> headList = new ArrayList<>(); class Head { String info; int groupFirstIndex; //点击(左边的)某个头时,需要知道其分组容器中对应组元素中第一条数据的下标 } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_goods, null); ButterKnife.inject(this, view); return view; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //获取测试数据 testData(); headAdapter = new MyHeadAdapter(); mLv.setAdapter(headAdapter); groupAdapter = new MyGroupAdapter(); mSlh.setAdapter(groupAdapter); mLv.setOnItemClickListener(this); //左边条目的点击事件 mSlh.setOnScrollListener(this); //右边滑动的监听 } private boolean isScroll = false; /** * 右边滚动的事件 */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //用户在滚动右边 isScroll = true; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //左边点击 导致右边滚动 只触发这个方法 if (isScroll) { Data data = dataList.get(firstVisibleItem); //当前正在置顶显示的头 headAdapter.setSelectedPosition(data.headIndex); //滚动左边时 右边的显示问题 int firstVisiblePosition = mLv.getFirstVisiblePosition(); int lastVisiblePosition = mLv.getLastVisiblePosition(); if (data.headIndex <= firstVisiblePosition || data.headIndex>=lastVisiblePosition){ mLv.setSelection(data.headIndex); } } } /** * 左边条目的点击事件 */ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.i("GoodsFragemnt","左边条目被点击了"); headAdapter.setSelectedPosition(position); Head head = headList.get(position); mSlh.setSelection(head.groupFirstIndex); isScroll = false; } //获取测试数据集合 private void testData() { //头条目的数据 for (int i = 0; i < 10; i++) { Head head = new Head(); head.info = "头数据:" + i; headList.add(head); } //获取右边的数据 for (int j = 0; j < headList.size(); j++) { Head head = headList.get(j); for (int i = 0; i < 10; i++) { Data data = new Data(); data.headId = j; //任意值 data.headIndex = j; data.info = "普通条目数据:第" + j + "组,条目数:" + i; if (i == 0) { //对应组元素中第一条数据的下标 head.groupFirstIndex = dataList.size(); } dataList.add(data); } } } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.reset(this); } /** * 右边条目的adapter */ private class MyGroupAdapter extends BaseAdapter implements StickyListHeadersAdapter { //分组 @Override public View getHeaderView(int position, View convertView, ViewGroup parent) { Data data = dataList.get(position); //头所在集合下标 Head head = headList.get(data.headIndex); TextView tv = new TextView(MyApplication.getContext()); tv.setText(head.info); tv.setBackgroundColor(Color.GRAY); return tv; } @Override public long getHeaderId(int position) { //position是普通条目的 里面有HeadId int headId = dataList.get(position).headId; return headId; } //普通条目 @Override public int getCount() { return dataList.size(); } @Override public Object getItem(int position) { return dataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView tv = new TextView(MyApplication.getContext()); tv.setText(dataList.get(position).info); tv.setTextColor(Color.GRAY); return tv; } } /** * 左边条目的adapter */ private class MyHeadAdapter extends BaseAdapter { private int mSelectedPosition; @Override public int getCount() { return headList.size(); } @Override public Object getItem(int position) { return headList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView tv = new TextView(MyApplication.getContext()); tv.setText(headList.get(position).info); tv.setLayoutParams(new ListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 80)); tv.setGravity(Gravity.CENTER); tv.setTextSize(16); tv.setTextColor(Color.BLACK); if (position == mSelectedPosition) { tv.setBackgroundColor(Color.WHITE); } else { tv.setBackgroundColor(Color.GRAY); } return tv; } /** * 左边条目的选择 **/ public void setSelectedPosition(int selectedPosition) { if (mSelectedPosition == selectedPosition){ return; //不用刷新 } mSelectedPosition = selectedPosition; notifyDataSetChanged(); } }}
布局文件:fragment_goods.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ListView android:id="@+id/lv" android:layout_width="100dp" android:layout_height="match_parent" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:scrollbars="none" > </ListView> <se.emilsjolander.stickylistheaders.StickyListHeadersListView android:id="@+id/slh" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"> </se.emilsjolander.stickylistheaders.StickyListHeadersListView></LinearLayout>
例外使用stickylistheaders之前需要导入依赖
//详情联动列表stickylistheaderscompile 'se.emilsjolander:stickylistheaders:2.7.0'
具体的stickylistheaders使用可自行百度
0 0
- android中仿<饿了么>listview与stickylistheaderslistview联动
- Android自定义控件——仿饿了么联动ListView
- 仿饿了么美团点餐界面,listView的二级联动
- 仿饿了么,百度外卖这些App的双ListView列表联动效果
- 仿抽屉式的ListView-StickyListHeadersListView的使用
- Android中listView联动效果
- Android 开源库StickyListHeadersListView来实现ListView列表分组效果
- listview滑动顶部停靠(stickyListHeadersListView)
- ReclyerView双联动,仿饿了吗店铺详情页
- android 仿饿了么购物车
- android 仿饿了么购物车
- Android 仿iPhone ListView拖动排序 按钮联动删除显示隐藏
- 仿饿了么 +
- Android ListView中两个Spinner如何实现联动?
- Android中ListView圆角实现,仿iPhone中UITableView
- ListView与ScrollView的联动
- Android联动ListView的实现
- Android联动ListView的实现
- 杭电OJ-A+B Coming
- <操作系统:精髓与设计原理> 线程
- 设计模式之单例模式
- Hibernate学习笔记(1)
- dfs-全排列
- android中仿<饿了么>listview与stickylistheaderslistview联动
- TensorFlow入门(二)--Rank,Shape,Type
- mysql存储过程
- 虚拟化中CPU指令集的问题
- 39.Linux 内核
- C#连接MYSQL数据库并进行查询
- Android设计模式(十一)-观察者模式
- C语言常用头文件及库函数
- springmvc + json + js + ajax 数据交互