效果图:
思路:
1左右是两个listView,左边显示类型,右边显示类型和内容
2左边控制右边
左边的条目点击事件中拿到左边点击的类型,循环右边的数据,
当判断左边类型和右边类型相等时,定位右边listView的位置
lvTest.setSelection(i);并且return;
代码:
// 类型listView的条目点击事件,定位右边列表
lvType.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 左边类型
String typeT=listType.get(position);
for(int i = 0; i < list.size(); i++) {
// 右边类型
String type=list.get(i).type;
if(typeT.equals(type)) {
// 把定位listView的位置
lvTest.setSelection(i);
return;
}
}
}
});
3右边控制左边
写右边listWiew的滑动监听setOnScrollListener,在onScroll方法中的参数firstVisibleItem显示第一个
条目的位置,拿到第一个条目对应的位置,传给类型的适配器,在类型适配器中判断选中
代码:
// 右边listView的滑动事件,点亮左边的选中
lvTest.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// 三个参数
// firstVisibleItem:当前能看见的第一个item的ID(从0开始)
// visibleItemCount:当前可见的item总数
// totalItemCount:列表中适配器总数量,也就是整个ListView中item总数
Logger.t("111").d("firstVisibleItem"+firstVisibleItem);
String type = list.get(firstVisibleItem).type;
typeAdapter.select(type);
}
});
4右边的listView中显示分类
其实每一个条目都有分类,只是不是一个分类的时候隐藏了;
实现代码:
在适配器的getView方法中:判断上一条和当前条目的类型是否一致,一样就隐藏,不一样就 显示
// 当前条目类型
String type=goosList.get(position).type;
if (position == 0) {
viewHolder.tvType.setVisibility(View.VISIBLE);
} else {
// 上一个条目类型
String nextType = goosList.get(position - 1).type;
if (type.equals(nextType)) {
viewHolder.tvType.setVisibility(View.GONE);
} else {
viewHolder.tvType.setVisibility(View.VISIBLE);
}
}
讲完了,下面贴出所有的代码:
MainActivity中
package com.zhh.listviewtest;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.Menu