ListView
添加新页面的步骤
- 在java包下对应子包中创建activity类
- 在layout包下创建对应的xml布局文件
- 在activity类中重写onCreate方法,并指定布局文件
- 在app/src/main/AndroidManifest.xml中添加声明
完整写法:<activity android:name=“com.example.test.listview.ListViewActivity”>
包名可以省略点保留,可以写作<activity android:name=".listview.ListViewActivity">
Context
- Context是什么?
-
Context是一个抽象类,其通用实现在ContextImpl类中。
-
Context:是一个访问application环境全局信息的接口,通过它可以访问application的资源和相关的类,其主要功能如下:
启动Activity
启动和停止Service
发送广播消息(Intent)
注册广播消息(Intent)接收者
可以访问APK中各种资源(如Resources和AssetManager等)
可以访问Package的相关信息
APK的各种权限管理从以上分析可以看出,Context就是一个对APK包无所不知的大管家,大家需要什么,直接问它就可以了。
-
Context与View的关系
View与Context(或Activity)的关系类似于明星与经纪人的关系,所以创建View时,必须明确指定其Context(即经纪人或大管家),否则View就成不了明星。 -
何时创建Context
应用程序在以下几种情况下创建Context实例:-
创建Application 对象时, 而且整个App共一个Application对象
-
创建Service对象时
-
创建Activity对象时
这三个类就是Context的三大实现类。
因此应用程序App共有的Context数目公式为:
总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)
-
适配器
要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView,后面还会学习其他的)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。
一般只要用BaseAdapter就行
ListView
-
ListView是一个列表控件。一个ListView通常有两个职责。
(1)将数据填充到布局。
(2)处理用户的选择点击等操作。
-
一个ListView的创建需要3个元素。
(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。
创建一个列表控件的步骤
- 在layout下创建xml布局文件
- 常用属性:
- listSelecter:设置布局样式,类似background
- divider:设置子项分割线的颜色
- dividerHeight:设置分割线的宽度
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:listSelector="@drawable/listview"
android:divider="#0f0"
android:dividerHeight="2dp">
</ListView>
</LinearLayout>
- 创建适配器类MyListAdapter
package com.example.test.listview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.test.R;
public class MyListAdapter extends BaseAdapter {
private Context context;
private LayoutInflater layoutInflater;
public MyListAdapter(Context context){
//Activity是Context的子类,在哪个activity里调这个方法,传进来的就是谁
this.context = context;
//根据这个Context(activity)创建layoutInflater对象,用来获取布局文件对象
layoutInflater = LayoutInflater.from(context);
}
@Override
//列表长度
public int getCount() {
return 10;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
//这个内部类是用来保存视图中控件的引用,以免每次都要重新find,浪费性能
static class ViewHolder{
public ImageView imageView;
public TextView tvTitle,tvTime,tvContent;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder = null;
if (view == null) {
//获取布局文件
view = layoutInflater.inflate(R.layout.layout_listview,null);
viewHolder = new ViewHolder();
viewHolder.imageView = view.findViewById(R.id.iv);
viewHolder.tvTitle = view.findViewById(R.id.tv_title);
viewHolder.tvTime = view.findViewById(R.id.tv_time);
viewHolder.tvContent = view.findViewById(R.id.tv_context);
view.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.tvContent.setText("这是setText的文本");
viewHolder.tvTime.setText("这是setText的文本");
viewHolder.tvTitle.setText("这是setText的文本");
Glide.with(context).load("").into(viewHolder.imageView);
return view;
}
}
layoutInflater.inflate的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById()的区别,inflate是加载一个布局文件,而findViewById则是从布局文件中查找一个控件。
- 创建ListViewActivity类,并为每个列表项添加点击和长按效果
package com.example.test.listview;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.example.test.R;
public class ListViewActivity extends Activity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
listView = findViewById(R.id.lv1);
//this表示当前对象,ListViewActivity.this这种写法一般用在内部类里,因为在外部类中直接可以用关键字this表示本类的对象,而内部类中直接写this的话表示的是内部类本身,想表示外部类的话就得加上外部类的类名.this。
listView.setAdapter(new MyListAdapter(ListViewActivity.this));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(ListViewActivity.this,"点击:"+i+"LONG:"+l,Toast.LENGTH_SHORT).show();
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(ListViewActivity.this,"长按:"+i+" long:"+l,Toast.LENGTH_SHORT).show();
//return false表示后续监听器继续执行,这样触发了长按后点击事件还会触发,设为true后续就不会触发
return true;
}
});
}
}
上一篇: 入冬以来
下一篇: 我们单位食堂自从换成老板小舅子承包以后
推荐阅读
-
Android Studio列表用法之一:ListView图文列表显示(实例)
-
JqueryMobile动态生成listView并实现刷新的两种方法
-
Android编程实现带有图标的ListView并带有长按菜单效果示例
-
Android实现读取SD卡下所有TXT文件名并用listView显示出来的方法
-
解决android Listview的item中最外层Margin失效的问题
-
(四十三)c#Winform自定义控件-Listview
-
Android TV listview及焦点处理
-
Android中使用ListView绘制自定义表格技巧分享
-
Android控件ListView用法(读取联系人示例代码)
-
自定义ListView实现拖拽ListItem项交换位置(附源码)