ListView的使用很广泛,也有很多小的设置方法;
Adapter作为ListView和数据源的适配器;
public class MessageAdapter extends BaseAdapter {
private static final int ViewTypeCount = 2;
private interface ViewType {
int TEXT = 0;
int IMAGE = 1;
}
private List<Object> messageList;
public MessageAdapter(List<Object> messageList) {
this.messageList = messageList;
}
@Override
public int getCount() {
return messageList.size();
}
@Override
public Object getItem(int position) {
return messageList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//获取ViewType的总量
@Override
public int getViewTypeCount() {
return ViewTypeCount;
}
//获取指定位置item的ViewType
@Override
public int getItemViewType(int position) {
if (getItem(position) instanceof String) {
return ViewType.TEXT;
} else {
return ViewType.IMAGE;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
ViewHolder holder;
if (getItemViewType(position) == ViewType.TEXT) {
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.item_text, parent, false);
TextView one = convertView.findViewById(R.id.one);
TextView two = convertView.findViewById(R.id.two);
holder = new ViewHolder(one, two);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
} else {
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.item_image, parent, false);
TextView one = convertView.findViewById(R.id.one);
TextView two = convertView.findViewById(R.id.two);
holder = new ViewHolder(one, two);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
}
holder.getOne().setText("");
holder.getTwo().setText("");
return convertView;
}
public static class ViewHolder {
private TextView one;
private TextView two;
public ViewHolder(TextView one, TextView two) {
this.one = one;
this.two = two;
}
public TextView getOne() {
return one;
}
public TextView getTwo() {
return two;
}
public void refreshContent(String one){
this.one.setText(one);
}
}
}
ListView添加头布局:
View headerView = LayoutInflater.from(this).inflate(R.layout.header_view, listview, false);
listview.addHeaderView(headerView);
ListView添加尾部局:
View footerView = LayoutInflater.from(this).inflate(R.layout.footer_view, listview, false);
listview.addFooterView(footerView);
ListView设置空布局:
View emptyView = findViewById(R.id.empty_view);
listview.setEmptyView(emptyView);
ListView添加头/尾布局后设置item点击事件时,数据源的position取值问题:
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mData.get(position);
mAdapter.getItem(position);
parent.getItemAtPosition(position);//最正确的获取
}
});
/**
* 如果ListView的item中存在button,会使item点击无效,
* 解决办法是在button上添加:
* android:focusable = "false"
* 或者是在根布局添加:
* android:descendantFocusability = "blocksDescendants"
*/
ListView滑动到底部自动刷新:
/**
* OnScrollListener
* ListView停止滑动
* public static int SCROLL_STATE_IDLE = 0;
* 手指还停留在屏幕上,ListView随着手指的滑动而滑动
* public static int SCROLL_STATE_IDLE = 1;
* 手指已经离开屏幕,ListView还在随着惯性滑动
* public static int SCROLL_STATE_IDLE = 2;
*/
listview.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.e("", "");
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem + visibleItemCount == totalItemCount) {
loadData();
mAdapter.notifyDataSetChanged();
}
}
});
/**
* setSelection
* 滑动到某一个item
* public void setSelection(int position);
* 滑动到某一个item,并距离顶部多少:y为正,表示遮挡多少距离
* public void setSelectionFromTop(int position,int y);
*
*/
/**
* scrollbars
*
* fadeScrollbars
* true:滑动结束隐藏滑动条
* false:一直显示滑动条
*
* fastScrollEnabled
* true:开始滑动的时候改变样式,变成可拖动条
*
* fastScrollAlwaysVisible
* true:可拖动条一直显示
*
* overScrollMode
* always:拖动到边界还可以继续拉
* never:拖动到边界还不可以继续拉
* ifContentScrolls:如果内容可以滚动就可以继续拉,如果内容不饿可以滚动就不可以继续拉
*
* overScrollHeader
* overScrollFooter
* 继续拖动多出来的地方的颜色
*
* requiresFadingEdge = vertical
* fadingEdgeLength = 100dp
* cacheColorHint = "#0F0F0F"
* 边缘部分有遮挡的渐变效果
* scrollingCache
* false:滑动的时候内容部分不显示颜色
* true:滑动的时候内容部分显示颜色
*
* listSelector
* 设置点击的时候item的背景颜色
* drawSelectorOnTop
* true:背景颜色遮罩内容
*
* divider
* @null 没有分割线
* 颜色 分割线颜色
* dividerHeight
* 分割线颜色
* headerDividerEnable
* footerDividerEnable
* headerView/footerView和内容之间的分割线是否显示
*
* stackFromBottom
* 从最底部到顶部进行布局
*
* transcriptMode
* alwaysScroll:添加项的时候会滑动到最底部
* normal:添加项的时候在最底部会滑动到最底部,否则不会
* disable:添加项的时候不会滑动到最底部
*
*/
ListView刷新某一个数据
private void partialRefresh(ListView listView, int position) {
if (position >= listView.getFirstVisiblePosition()
&& position <= listView.getLastVisiblePosition()) {
int childIndex = position - listView.getFirstVisiblePosition();
View child = listView.getChildAt(childIndex);
if (child.getTag() instanceof MessageAdapter.ViewHolder) {
((MessageAdapter.ViewHolder) child.getTag()).refreshContent("");
}
}
}
本文深入解析了ListView组件的高级用法,包括自定义Adapter实现不同类型的数据展示,头尾布局的添加,空布局设置,以及复杂的点击事件处理。同时,介绍了如何通过OnScrollListener实现滑动到底部自动加载更多数据,以及各种滚动、选择和样式设置的方法。
465

被折叠的 条评论
为什么被折叠?



