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
原创粉丝点击