效果图.gif
注:数据是别人大神的
我们看下我们的json数据结构
数据结构.png
实现思路;
1.首先我们需要解析(我的放在本地assets文件夹下面名字为category.json)数据,将.json数据转换成string
/**
* 得到json文件中的内容
*/
public static String getJson(Context context, String fileName) {
StringBuilder stringBuilder = new StringBuilder();
//获得assets资源管理器
AssetManager assetManager = context.getAssets();
//使用IO流读取json文件内容
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
assetManager.open(fileName), "utf-8"));
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
2.将String类型的数据转成相应的对象,并保存左边listview的位置
private void loadData() {
//解析本地的json数据
String json = getJson(this, "category.json");
Gson gson = new Gson();
CategoryBean categoryBean = gson.fromJson(json, CategoryBean.class);
showTitle = new ArrayList<>();
for (int i = 0; i < categoryBean.getData().size(); i++) {
CategoryBean.DataBean dataBean = categoryBean.getData().get(i);
menuList.add(dataBean.getModuleTitle());
showTitle.add(i);
homeList.add(dataBean);
}
tv_title.setText(categoryBean.getData().get(0).getModuleTitle());
menuAdapter.notifyDataSetChanged();
homeAdapter.notifyDataSetChanged();
}
3.我们这时候会发现,我们实际在右边是解析了所有数据,这时候我们需要实现左右两个listview进行关联,首先我们对左边的listview进行点击事件
lv_menu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
menuAdapter.setSelectItem(position);
menuAdapter.notifyDataSetInvalidated();
tv_title.setText(menuList.get(position));
lv_home.setSelection(position);
}
});
右边listview滑动事件的处理
lv_home.setOnScrollListener(new AbsListView.OnScrollListener() {
private int scrollState;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.scrollState = scrollState;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
return;
}
int current = showTitle.indexOf(firstVisibleItem);
if (currentItem != current && current >= 0) {
currentItem = current;
tv_title.setText(menuList.get(currentItem));
menuAdapter.setSelectItem(currentItem);
menuAdapter.notifyDataSetInvalidated();
}
}
});