1.ListView第一条数据不显示问题
一般就是两方面的问题,不一定准确哈,希望能帮上有需要的人们,不喜勿喷,谢谢!
1.查看activity中的data是否实例 adapter只绑定一次 剩下的notifyDataSetChanged
2.过滤数据的时候在activity中做 不要去adapter中去做
2.ListView只显示第一条数据问题
请先检查你的数据是否已经获取到
检查数据,检查数据,检查数据,重要的事情说三遍
/**失败展示**/
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="********start*********" />
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ListView>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="********end*********" />
</LinearLayout>
</ScrollView>
1.一般是把ListView放在了ScrollView里面,这就会导致ListView的其他数据未显示出来
最简单的解决办法就是删除ScrollView控件
很多人都会问,为啥会存在这种结构呢,因为现实真实需要这种结构,比如头部需要一个标题,底部需要一个结尾,中间需要展示ListView,就需要这种结构的存在,整体还需要滚动
2.动态设置高度
/**
* 动态设置高度
* 传入View控件
* @param listView
*/
public static void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
// 判断非null
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
// 循环整个列表 算出整个ListView所占的高度
for (int i = 0, i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
注意: 这种方法只适合单层LinearLayout,不适合其他情况;
还需手动将ScrollView滚动至顶端
sv.smoothScrollTo(0, 0);
3.把头部和底部直接拼接在ListView里面,也就是使用ListView显示,不需要ScrollView
在自定义的Adapter里面做相应判断
public View getView(int position, View convertView, ViewGroup parent) {
//列表第一项
if(position == 0){
convertView = inflater.inflate(R.layout.item_top, null);
return convertView;
}
//列表最后一项
else if(position == data.size()-1){
convertView = inflater.inflate(R.layout.item_bottom, null);
return convertView;
}
//普通列表项
ViewHolder h = null;
if(convertView == null || convertView.getTag() == null){
convertView = inflater.inflate(R.layout.item_listview, null);
h = new ViewHolder();
h.tv = (TextView) convertView.findViewById(R.id.item_listview_tv);
convertView.setTag(h);
}else{
h = (ViewHolder) convertView.getTag();
}
h.tv.setText("第"+ position + "条数据");
return convertView;
}
4.既然我们可以动态设置高度,那么我们直接自定义一个ListView去适应这个ScrollView,岂不是更加方便
public class ListViewForScrollView extends ListView {
public ListViewForScrollView(Context context) {
super(context);
}
public ListViewForScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListViewForScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
/**
* 重写方法,使ListView适应ScrollView
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
注意:这个方法跟动态设置ListView高度一样,都需要手动设置ScrollView到顶部
sv.smoothScrollTo(0, 0);
今天就介绍到这里,有时间在继续
/************************************************************************************/