ListView的用法_listview用法-程序员宅基地

技术标签: listview  android  Android  

一、 ListView的使用

<ListView>:用于展示大量数据的一种列表视图,通过上下滑动的方式将屏幕外的数据滚动到屏幕内。
数据无法直接传递给ListView,需要适配器
Adapter:作用是将各种数据以合适的形式展示到View上

实例:

在这里插入图片描述
Food.java:

public class Food {
    
    private String name;
    private String describe;
    private int imageId;//图片id
    public Food(String name, String describe, int imageId) {
    
        this.name = name;
        this.describe = describe;
        this.imageId = imageId;
    }
    public String getName() {
    
        return name;
    }
    public void setName(String name) {
    
        this.name = name;
    }
    public String getDescribe() {
    
        return describe;
    }
    public void setDescribe(String describe) {
    
        this.describe = describe;
    }
    public int getImageId() {
    
        return imageId;
    }
    public void setImageId(int imageId) {
    
        this.imageId = imageId;
    }
}

activity_main

<?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">
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

food_item.xml:ListView中每一项的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/food_image"
        android:layout_width="100dp"
        android:layout_height="100dp"/>
    <TextView
        android:id="@+id/food_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/food_image"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="20dp"
        android:textSize="20sp"
        android:textColor="#000000"/>
    <TextView
        android:id="@+id/describe_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/food_name"
        android:layout_alignLeft="@+id/food_name"
        android:layout_marginTop="20dp"
        android:textSize="15sp"
        android:textColor="#000000"/>
</RelativeLayout>

FoodAdapter:自定义适配器,通过适配器将要适配的数据传递给ListView

//自定义Adapter继承自BaseAdapter
public class FoodAdapter extends BaseAdapter {
    
    private Context context;
    private List<Food> foodList;
    public FoodAdapter(Context context, List<Food> foodList){
    
        this.context = context;
        this.foodList = foodList;
    }
    @Override
    //填充的item的个数
    public int getCount() {
    
        return foodList.size();
    }
    @Override
    //指定索引对应的item的数据项
    public Object getItem(int position) {
    
        return null;
    }
    @Override
    //指定索引对应的item的id值
    public long getItemId(int position) {
    
        return position;
    }
    @Override
    //填充每个item的内容
    public View getView(int position, View convertView, ViewGroup viewGroup) {
    
        View view = null;
        ViewHolder viewHolder = null;
        if(convertView == null){
    
            //加载布局文件,将布局文件转换成View对象
            view = LayoutInflater.from(context).inflate(R.layout.food_item,null);
            //创建ViewHolder对象
            viewHolder = new ViewHolder();
            //实例化ViewHolder
            viewHolder.foodImage = view.findViewById(R.id.food_image);
            viewHolder.foodName = view.findViewById(R.id.food_name);
            viewHolder.describe = view.findViewById(R.id.describe_text);
            //将viewHolder的对象存储到View中
            view.setTag(viewHolder);
        }else{
    
            view = convertView;
            //取出ViewHolder
            viewHolder = (ViewHolder)view.getTag();
        }
        //给item中各控件赋值
        viewHolder.foodImage.setImageResource(foodList.get(position).getImageId());
        viewHolder.foodName.setText(foodList.get(position).getName());
        viewHolder.describe.setText(foodList.get(position).getDescribe());
        return view;
    }
}
//存放item中的所有控件
class ViewHolder{
    
    ImageView foodImage;
    TextView foodName;
    TextView describe;
}

原理
每个子项被滚动到屏幕内会调用getView()
通过convertView只需加载一次布局
当convertView为null时,动态加载布局。
当convertView不为null时,复用此布局。这样就不需要给滚动到屏幕中的每个item加载一次布局。
通过ViewHolder只需获取一次控件的实例
将所有控件实例都放在ViewHolder里。
当convertView为null时,实例化ViewHolder,调用View的setTag()方法,将ViewHolder对象存储在View中。
当convertView不为null时,调用View的getTag()方法,将ViewHolder取出。这样所有控件实例都缓存到ViewHolder中。这样就不需要每调用一个getView就调用findViewById()方法获取控件了。
只需给ViewHolder中的控件赋值即可

方法详解
public FoodAdapter(Context context, List foodList):适配器构造函数

  • 第一个参数:上下文
  • 第二个参数:要适配的数据

getCount():获得ListView中item的个数
getItem(int position) :指定索引对应的item的数据项
getItemId(int position):指定索引对应的item的id值
getView(int position, View convertView, ViewGroup viewGroup):用于填充每个item的内容

  • 第一个参数:表示进行操作的是哪一个item
  • 第二个参数:用于将之前加载的布局缓存,以便之后进行重用。也是待返回的View信息

setTag(Object tag): 用于给View设置一个标签,标签可以是任何对象。
getTag():取出View里设置的标签
LayoutInflater.from(Context context):创建LayoutInflater对象
inflate(int resource, @Nullable ViewGroup root)::动态加载布局文件

  • 第一个参数:要加载的布局文件的id
  • 第二个参数:给加载好的布局文件添一个父布局

setImageResource(int resId):设置显示的图片
setText(CharSequence text):设置显示的文字
ViewHolder:用来对控件的实例进行缓存,将item中的控件都放在这里

public class MainActivity extends AppCompatActivity{
    
    private List<Food> foodList;
    private Food food;
    private FoodAdapter adapter;
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //创建适配器
        adapter = new FoodAdapter(MainActivity.this,foodList);
        //ListView绑定适配器
        listView.setAdapter(adapter);
        //执行点击事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
    
                food = foodList.get(position);
                Toast.makeText(MainActivity.this,food.getName(),Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initView() {
    
        listView = (ListView)findViewById(R.id.list_view);
        //创建集合用来存放food
        foodList = new ArrayList<Food>();
        //初始化food并添加到集合中
        foodList.add(new Food("绿茶","绿色的茶",R.drawable.img1));
        foodList.add(new Food("汉堡","面包加肉",R.drawable.img2));
        foodList.add(new Food("米饭","中国主食",R.drawable.img3));
        foodList.add(new Food("寿司","日式料理",R.drawable.img4));
        foodList.add(new Food("牛排","这是牛排",R.drawable.img5));
        foodList.add(new Food("蛋糕","这是甜点",R.drawable.img6));
        foodList.add(new Food("奶茶","离不开的",R.drawable.img7));
        foodList.add(new Food("披萨","外国主食",R.drawable.img8));

    }
}

方法详解:
setAdapter(ListAdapter adapter):设置ListView的适配器,通过该方法将ListView与适配器绑定起来
setOnItemClickListener(AdapterView.OnItemClickListener listener):为ListView注册监听器,点击ListView中的每一个子项,都会回调onItemClick()方法。通过onItemClick()方法的position参数可判断出用户点击的是哪一个子项

二、ListView焦点问题

如果在ListView的Item中添加了Button,CheckBox,EditText等控件的话,当点击item会发现, ListView的item点击不了,触发不了onItemClick的方法,也触发不了onItemLongClick方法, 这个就是ListView的一个焦点问题了!就是ListView的焦点被其他控件抢了。
解决办法:
方法一:
布局文件中:为抢占了ListView Item焦点的控件设置android:focusable="false"
方法二:
在代码中:获得控件后调用:setFocusable(false)
方法三:
item根节点设置:android:descendantFocusability="blocksDescendants“
blocksDescendants表示viewgroup会覆盖子类控件而直接获得焦点

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/momoyxy/article/details/119854998

智能推荐

Springboot 整合Mytbatis与Mybatis-Plus_springboot集成mybatis和mybatisplus-程序员宅基地

文章浏览阅读2.6k次,点赞3次,收藏7次。springboot整合mybatis主包名要为 com.jmh.ssmspringboot整合mybatis-plus主包名为 com.jmh.ssmmp。_springboot集成mybatis和mybatisplus

数据分析:预测汽车违约风险_车辆贷款违约预测-程序员宅基地

文章浏览阅读2.8k次,点赞7次,收藏49次。本文通过分析汽车贷款违约情况,利用多种机器学习模型进行预测。首先,对数据进行预处理,包括处理缺失值、异常值等,然后使用线性回归、决策树、随机森林、支持向量机 (SVM) 和 K-近邻 (KNN) 等模型进行训练和预测。最后,通过绘制 ROC 曲线并计算 AUC 来评估模型的性能。_车辆贷款违约预测

无法打开虚拟机,获取该虚拟机的所有权失败。 主机上的某个应用程序正在使用该虚拟机。_"主机上的某个应用程序正在使用该虚拟机。 open() \"/etc/nginx/mime.type-程序员宅基地

文章浏览阅读4.7k次,点赞13次,收藏12次。D:\Program Files (x86)\VMwareWorkspace\henu3\henu3.vmx在启动即可!_"主机上的某个应用程序正在使用该虚拟机。 open() \"/etc/nginx/mime.types\" failed"

Windows+Ubuntu双系统如何彻底删除Ubuntu操作系统_cmd卸载ubuntu-程序员宅基地

文章浏览阅读8.8k次,点赞27次,收藏103次。成功安装了Windows10+Ubuntu20.04双系统,还没怎么用ubuntu空间就小的可怜,连下载一个文件的空间都没有了,最终决定删除ubuntu,还原为原来的干净的Windows环境_cmd卸载ubuntu

漫步数学分析十三——路径连通_路径连续推导连续-程序员宅基地

文章浏览阅读2.2k次。第二个重要的主题是连通性,我们直观上知道想应用连通性到哪种集合上,然而,我们的直观在判断更复杂的集合时可能会失效,例如如果R2R^2中的集合为{(x,sin1/x)|x>0}∪{(0,y)|y∈[−1,1]}\{(x,\sin 1/x)|x>0\}\cup\{(0,y)|y\in[-1,1]\},那么它是连通的吗?如图???\ref{fig:3-3}所示,现在我们想用严格的定义来形式化这个概念。_路径连续推导连续

html中怎么获取搜索框中的值,input搜索框如何获取li标签中的值?-程序员宅基地

文章浏览阅读629次。这是个模糊搜索框,但是我要怎么做才能获取到下拉列表的中被填入input框中的值呢?比如说我输入pc,然会出来这些pc号码,我用键盘里的方向键或者鼠标点击其中一个pc4,这样input框就会显示pc4同时下拉菜单被收起来,问题就是我要怎么获取到这个input框中的pc4这个值呢???对了 我这些数据是从后台请求过来的,包括整个搜索框都是用js代码动态建立的,所以我本来是想用alert($("#sea..._获取input里面的值点击搜索按钮搜索相应的信息

随便推点

语音匹配_什么是语音匹配?-程序员宅基地

文章浏览阅读2.1k次。语音匹配Google voice match feature has been rolled out. Now, your smart device will recognize you with the help of your voice. Bid adieu to complex configurations and authorizations while purchases and sw..._语音比对

WP-Syntax 插件使用方法-程序员宅基地

文章浏览阅读93次。技术博客中使用WP-Syntax将代码高亮是最常见的。而一段时间不用总会忘记每种语言的的pre标签的值。这里简单介绍下,WP-Syntax 是一个针对 Wordpress 的代码高亮插件,最大的优点是简单易用,兼容性非常好。由于安装好后,后台编辑器不会出现相应的按钮。所以网上有很多网友通过修改 \wp-includes\js\quicktags.js 这个文件来实现添加相应的按钮,方便编辑。..._wp-syntax设置

python生成随机IP,随机数字,随机日期,随机字符串_"print(\"0x%02x\" % secrets_generator.randint(0,25-程序员宅基地

文章浏览阅读4.2k次。随机IP:#定义4个0-255的随机数字,然后用.将四个随机数拼接起来m=random.randint(0,255)n=random.randint(0,255)x=random.randint(0,255)y=random.randint(0,255)randomIP=str(m)+’.’+str(n)+’.’+str(x)+’.’+str(y)随机数字:randomInt=ra..._"print(\"0x%02x\" % secrets_generator.randint(0,255), end="

路由器重温——WAN接入/互联-DCC配置管理2_dialer-rule-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏5次。配置DCC拨号接口属性拨号接口(包括物理拨号接口和Dialer接口)一旦创建,就会被赋予一系列属性参数的缺省值,因此本项配置任务为可选。①链路空闲时间设置当链路空闲超过了指定时间后,DCC将断开链路。这个空闲时间也即是链路中不存在符合拨号访问控制列表的permit条件的报文传送时间。②下次呼叫发起前的链路断开时间当DCC呼叫链路因故障或挂断等原因导致进入断开状态,必须经过指定时间后才能建立新的拨号连接(即进行下一次呼叫的间隔时间),从而避免对端PBX设备过载。③接口竞争时的链路空闲时_dialer-rule

上百套springboot,python,ssm和小程序毕业设计作品(1)-程序员宅基地

文章浏览阅读692次,点赞9次,收藏11次。不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~给大家准备的学习资料包括但不限于:Python 环境、pycharm编辑器/永久激活/翻译插件python 零基础视频教程Python 界面开发实战教程Python 爬虫实战教程Python 数据分析实战教程python 游戏开发实战教程Python 电子书100本。

Java经典面试(三)_map<integer, int[]> positions = memorytest(numbers-程序员宅基地

文章浏览阅读500次。Java经典面试(三)一、java基础字符串常量Java内部加载-上二、JUC三、Spring四、Redis五、补充和总结一、java基础字符串常量Java内部加载-上代码:public class StringPoolDemo { public static void main(String[] args) { String str1 = new StringBuffer("mei").append("tuan").toString(); System.ou_map positions = memorytest(numbers)

推荐文章

热门文章

相关标签