最近做一个项目,想要模仿现在市面上的比较好看的一个界面显示多个listview效果,如图:
大概就是这么个样子,许多app就是采用这种样式,还是挺好看的。
我自己也做了一个类似的,想法就是scrollView + listview. 但是在过程中我发现一个问题:每个listview只显示一个item,当时我就懵逼了,网上看了下资料,大概原因就是scrollview中嵌套listview后,无法正确计算listview的大小。
怎么解决呢?先来看看我的布局(find_layout.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:weightSum="4"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#1cc019">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发现"
android:textSize="15dp"
android:textColor="#ffffff"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/textView"/>
</RelativeLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:id="@+id/find_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:dividerHeight="2px"
android:divider="@color/light_gray">
</ListView>
<TextView
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@color/size_bg"/>
<ListView
android:id="@+id/find_listView_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:dividerHeight="2px"
android:divider="@color/light_gray">
</ListView>
<TextView
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@color/size_bg"/>
<ListView
android:id="@+id/find_listView_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:dividerHeight="2px"
android:divider="@color/light_gray">
</ListView>
</LinearLayout>
</ScrollView>
</LinearLayout>
在scrollview里面嵌套3个listview。
再来看看代码:
public class FindFragment extends Fragment {
ListView listView,listView_1,listView_2;
int[] imgID = new int[] {R.mipmap.nav_challenge_1,R.mipmap.nav_path_1,
R.mipmap.nav_cir_1,R.mipmap.nav_feed_1};
String[] txt = new String[] {"挑战","足迹","社区","发现"};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View findLayout = inflater.inflate(R.layout.find_layout, container, false);
initViews(findLayout);
return findLayout;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {//一般非静态view才在这里面处理
super.onActivityCreated(savedInstanceState);
List<Map<String,Object>> listItems = new ArrayList<Map<String, Object>>();
for (int i = 0; i < imgID.length;i++) {
Map<String,Object> listItem = new HashMap<String, Object>();
listItem.put("image",imgID[i]);
listItem.put("text", txt[i]);
listItems.add(listItem);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity(), listItems, R.layout.simple_item_02,
new String[]{"image","text"},
new int[]{R.id.header_1,R.id.desc_1});
listView.setAdapter(simpleAdapter);
listView_1.setAdapter(simpleAdapter);
listView_2.setAdapter(simpleAdapter);
//解决scrollview中嵌套listview只显示一个item的问题
setListViewHeightBasedOnChildren(listView);
setListViewHeightBasedOnChildren(listView_1);
setListViewHeightBasedOnChildren(listView_2);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
Toast.makeText(getActivity(),"挑战-01",Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(getActivity(),"挑战-02",Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(getActivity(),"挑战-03",Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(getActivity(),"挑战-04",Toast.LENGTH_SHORT).show();
break;
}
}
});
}
public void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
private void initViews(View findLayout) {
listView = (ListView)findLayout.findViewById(R.id.find_listView);
listView_1 = (ListView)findLayout.findViewById(R.id.find_listView_1);
listView_2 = (ListView)findLayout.findViewById(R.id.find_listView_2);
}
public void setMenuVisibility(boolean menuVisibility) {
super.setMenuVisibility(menuVisibility);
if (this.getView() != null) {
this.getView().setVisibility(menuVisibility ? View.VISIBLE : View.GONE);
}
}
}
主要的处理就在
setListViewHeightBasedOnChildren(ListView listView)
这个方法里面了,重新计算了一下listview的空间。
来看看运行结果:
这样就成功了!其实还有一个办法,但是不能滑动,就是在scrollview中添加这个属性:android:fillViewport="true"
本文解决办法来自这篇博客:http://www.cnblogs.com/zhwl/p/3333585.html