ListView[0] 功能
来源:互联网 发布:淘宝极速退款 编辑:程序博客网 时间:2024/06/11 03:18
【参考链接】
一个ListView的基本使用方式如下
activity的布局文件
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
item的布局文件
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
/>
</LinearLayout>
Activity
public classBaseAdapterActivityextendsActivity {
privateList<String>mData;
private ListViewmListView;
private MyBaseAdaptermAdapter;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
initData();
mAdapter=newMyBaseAdapter(this,mData);
mListView= (ListView) findViewById(R.id.lv);
mListView.setAdapter(mAdapter);
}
private voidinitData(){
mData=newArrayList<String>();
for (inti =0;i <20;i++) {
mData.add(""+ i);
}
}
}
Adapter,通过ViewHolder,减少复用时的findViewById()
public classMyBaseAdapterextendsBaseAdapter {
privateList<String>mData;
private LayoutInflatermInflater;
public final class ViewHolder {
publicImageViewimg;
public TextViewtitle;
}
publicMyBaseAdapter(Context context,List<String> data) {
this.mData= data;
mInflater= LayoutInflater.from(context);
}
@Override
public intgetCount() {
returnmData.size();
}
@Override
publicObjectgetItem(intposition) {
returnmData.get(position);
}
@Override
public longgetItemId(intposition) {
returnposition;
}
@Override
publicViewgetView(intposition,View convertView,ViewGroup parent) {
ViewHolder holder = null;
//判断是否缓存
if(convertView ==null) {
holder = newViewHolder();
//通过LayoutInflater实例化布局
convertView =mInflater.inflate(R.layout.base_adapter_item, null);
holder.img= (ImageView)convertView.findViewById(R.id.imageView);
holder.title= (TextView)convertView.findViewById(R.id.textView);
convertView.setTag(holder);
}else{
//通过tag找到缓存的布局
holder =(ViewHolder) convertView.getTag();
}
holder.img.setBackgroundResource(R.drawable.ic_launcher);
holder.title.setText(mData.get(position));
return convertView;
}
}
setAdapter()
系统提供了多种Adapter
ArrayAdapter
ArrayAdapter一般用于显示字符串,并且系统提供了很多内置item布局文件,
布局文件中有一个TextView的id为"@android:id/text1",会自动将数据项转换成String显示为TextView的text
public classArrayAdapterActivityextendsActivity {
privateList<String>mData;
private ListViewmListView;
private ArrayAdapter<String>mAdapter;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
initData();
mAdapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mData);
mListView= (ListView) findViewById(R.id.lv);
mListView.setAdapter(mAdapter);
}
private voidinitData(){
mData=newArrayList<String>();
for (inti =0;i <20;i++) {
mData.add(""+ i);
}
}
}
当数据项传递的非String时会转换成String
public classArrayAdapterActivity2extendsActivity {
privateList<Object>mData;
private ListViewmListView;
private ArrayAdapter<Object>mAdapter;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
initData();
mAdapter=newArrayAdapter<Object>(this,android.R.layout.simple_list_item_1,mData);
mListView= (ListView) findViewById(R.id.lv);
mListView.setAdapter(mAdapter);
}
private voidinitData(){
mData=newArrayList<Object>();
for (inti =0;i <20;i++) {
mData.add(newObject());
}
}
}
SimpleAdapter
SimpleAdapte使用两次映射的方式,通过item布局文件中View的id对应到数据项Map的key,再对应到数据项Map的value。
如果View的类型为TextView、Button等,则将value转换成String显示成text
如果View的类型为ImageView等,则将value转换成int作为id取到图片显示成src
item的布局文件
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView android:id="@+id/iv_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5px"
android:padding="10dp"
android:background="#FF0000"/>
<LinearLayout android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="22px"
android:text="title"/>
<TextView android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="13px"
android:text="info"/>
</LinearLayout>
</LinearLayout>
Activity
public classSimpleAdapterActivityextendsActivity {
privateList<Map<String,Object>>mData;
private ListViewmListView;
private SimpleAdaptermAdapter;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
initData();
mAdapter=newSimpleAdapter(this,
mData,
R.layout.simple_adapter_item,
new String[]{"title","info","img"},
new int[]{R.id.tv_title,R.id.tv_info,R.id.iv_img});
mListView= (ListView) findViewById(R.id.lv);
mListView.setAdapter(mAdapter);
}
private voidinitData(){
mData=newArrayList<Map<String,Object>>();
Map<String,Object> map =newHashMap<String,Object>();
map.put("title","G1");
map.put("info","google 1");
map.put("img",R.drawable.img);
mData.add(map);
map =newHashMap<String,Object>();
map.put("title","G2");
map.put("info","google 2");
map.put("img",R.drawable.img);
mData.add(map);
map =newHashMap<String,Object>();
map.put("title","G3");
map.put("info","google 3");
map.put("img",R.drawable.img+" ");//会导致取不到图片了
mData.add(map);
}
}
BaseAdapter
最初的例子就是BaseAdapter的用法了
notifyDatasetChanged()
当更新数据源以后调用mAdapter.notifyDatasetChanged()即可通知ListView重绘界面
需要注意的是
1. 数据源List必须得是同一个对象
2. notifyDatasetChanged()的调用必须得在主线程中
3. newThread(){
@Override
public voidrun() {
mData.add("new");
runOnUiThread(newRunnable() {
@Override
public voidrun() {
mAdapter.notifyDataSetChanged();
}
});
}
}.start();
setSelection()
将第N项显示在ListView顶部,N从0开始
如果要超出底部,则只滑动到底部,如果要超出顶部,则只滑动到顶部
这个显示是瞬间完成的
smoothScrollToPosition()
向上或向下滑动使第N项显示到界面顶端或底端
如果已在界面中则不进行处理
平滑滑动
getFirstVisiblePosition()、getLastVisiblePosition()
获取在当前显示界面中的第一个、最后一个item在data中的position
getChildCount()、getChildAt()
ListView的子View只包含在当前显示界面中的(包括不完全显示的)
所以注意传递给getChildAt()的参数不能是item在data的position
setOnScrollListener()
注意跟scrollTo()/scrollBy()中的setOnScrollChangeListener()方法不同
有两个回调函数
mListView.setOnScrollListener(newAbsListView.OnScrollListener() {
@Override
public voidonScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public voidonScroll(AbsListView view, int firstVisibleItem, intvisibleItemCount, inttotalItemCount) {
}
});
onScrollStateChanged()中的scrollState共有3种
AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:手指在ListView中滑动时
AbsListView.OnScrollListener.SCROLL_STATE_FLING:手指离开ListView,并且ListView会因为惯性而继续滑动时。只有当滑动速度达到一定要求时才会触发,并且只回调一次
AbsListView.OnScrollListener.SCROLL_STATE_IDLE:ListView停止滑动时
一次快速滑动时的日志输出如下
onScroll()
firstVisibleItem:第一个可见的item在data中的位置
visibleItemCount:可见的item的总数
totalItemCount:data中所有的item
setOnItemClickListener()
ListView提供了方法来处理item的点击事件,后面会讲到还可以设置item的背景色
不过现在已经不建议使用这两种方式了,可以交给item的View进行处理
并且这个方法有个弊端就是
当Item当中有Button等时,因为Button会先获取到焦点,导致在item上点击时无法触发到这个方法。
- ListView[0] 功能
- ListView实现分页功能
- ListView实现分页功能
- ListView实现分页功能
- listview扩展功能
- android listView功能简介
- ListView多选功能
- ListView 实现全选功能
- listView自动滑动功能
- ListView实现倒计时功能
- ListView实现分页功能
- ListView倒计时功能实现
- ListView 功能记录
- Android ListView倒计时功能
- ListView实现倒计时功能
- RecyclerView实现ListView功能
- ReactNative ListView基础功能
- 让listview增加编辑功能
- Android框架的收藏
- 输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
- bzoj 1662: [Usaco2006 Nov]Round Numbers 圆环数(枚举)
- dubbo+zookeeper+dubbo-admin环境的搭建
- STlink V2 烧录器使用
- ListView[0] 功能
- 第二周项目三 两种排序算法的运算时间
- C++ list remove 方法的错误C2678
- Redis 配置文件详解
- Android自定义饼状图
- 三千记之实践应用
- Batch Normalization详解
- Vue2 移动端开发记录
- org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res