Android : ListView + BaseAdapter-2简单应用

news2025/4/7 5:07:07

 ​​容器与适配器:​​​​​        http://t.csdnimg.cn/ZfAJ7

实体类 News.java

package com.example.mylistviewadapter2.entity;


public class News {
    private   String title;
    private  String content;
    private int img;

    public News(String title, String content, int img){
        this.title = title;
        this.content = content;
        this.img =img;
    }

    public String getTitile() {
        return title;
    }

    public void setTitile(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getImg() {
        return img;
    }

    public void setImg(int img) {
        this.img = img;
    }
}

适配器 写个类继承BaseAdapter 

package com.example.mylistviewadapter2;

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.example.mylistviewadapter2.entity.News;

import java.util.List;

public class NewsAdpater extends BaseAdapter {
    private List<News> date;
    private Context context;
    //两个标记类
    private  static final  int TYPE_NEWS_1 = 0;
    private  static final  int TYPE_NEWS_2 = 1;
    //構造器
    public NewsAdpater(List<News> date, Context context){
        this.date = date;
        this.context = context;
    }

    //BaseAdapter最基本的几个方法:
    // 1. getCount 填充的数据集数
    // 2.getItem 数据集中指定索引对应的数据项
    // 3. getItemId 指定行所对应的ID
    // 4. getView 每个Item所显示的类容

    @Override
    public int getCount() {
        //充的数据集数
        return date.size();
    }

    @Override
    public Object getItem(int position) {
        //数据集中指定索引对应的数据项
        return date.get(position);
    }

    @Override
    public long getItemId(int position) {
        // 指定行所对应的ID
        return position;
    }

    //重写 getItemViewType 返回对应的item布局类型
    @Override
    public int getItemViewType(int position) {
       if(position % 2 == 0){
           return TYPE_NEWS_1;
       }else{
           return TYPE_NEWS_2;
        }
    }
    //重写 getViewTypeCount 返回总共有几个item布局类型
    @Override
    public int getViewTypeCount() {
        return 2;
    }

    //优化
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //获取布局类型
        int type = getItemViewType(position);

        ViewHoler holer = null;
        ViewHoler2 holer2 = null;
        if(convertView == null){
            switch (type){
                case TYPE_NEWS_1:
                    holer = new ViewHoler();
                    //每个Item所显示的类容
                    convertView =  LayoutInflater.from(context).inflate(R.layout.left_list_view,parent,false);
                    holer.imageView = convertView.findViewById(R.id.btnImg);
                    holer.tvTitle = convertView.findViewById(R.id.tvH);
                    holer.tbCont = convertView.findViewById(R.id.tvCont);

                    convertView.setTag(holer);
                    break;
                case TYPE_NEWS_2:
                    holer2 = new ViewHoler2();
                    //每个Item所显示的类容
                    convertView =  LayoutInflater.from(context).inflate(R.layout.right_list_view,parent,false);
                    holer2.imageView = convertView.findViewById(R.id.btnImg2);
                    holer2.tvTitle = convertView.findViewById(R.id.tvH2);
                    holer2.tbCont = convertView.findViewById(R.id.tvCont2);

                    convertView.setTag(holer2);
                    break;
            }

        }else {
            switch (type){
                case TYPE_NEWS_1:
                    holer = (ViewHoler)convertView.getTag();
                    break;
                case  TYPE_NEWS_2:
                    holer2 = (ViewHoler2)convertView.getTag();
                    break;

            }
        }

        switch (type){
            case TYPE_NEWS_1:
                //摄入值
                holer.imageView.setBackgroundResource(date.get(position).getImg());
                holer.tvTitle.setText(date.get(position).getTitile());
                holer.tbCont.setText(date.get(position).getContent());
                break;
            case TYPE_NEWS_2:
                //摄入值
                holer2.imageView.setBackgroundResource(date.get(position).getImg());
                holer2.tvTitle.setText(date.get(position).getTitile());
                holer2.tbCont.setText(date.get(position).getContent());
               break;
        }

        return convertView;
    }
    static class ViewHoler{
        ImageView imageView;
        TextView tvTitle;
        TextView tbCont;
    }

    static class ViewHoler2{
        ImageView imageView;
        TextView tvTitle;
        TextView tbCont;
    }
}

MainActivity.java

package com.example.mylistviewadapter2;

import static android.widget.Toast.LENGTH_SHORT;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import com.example.mylistviewadapter2.entity.News;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    //
    private ListView listView;
    private Context context;
    private List<News> listNews =null;

    //适配器
    private  NewsAdpater newsAdpater=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;

        listView = findViewById(R.id.listVi);

        listNews = new ArrayList<>();
        //传入内容
        for(int i= 0 ; i < 10; i++){
            listNews.add(new News("这是标题"+i,"我是内容我是内容我是内容我是内容我是内容我是内容我是内容"+i,R.mipmap.bg));
        }
        newsAdpater = new NewsAdpater(listNews,context);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(context, "点击了第" + position + "条数据", LENGTH_SHORT).show();
            }
        });
        //往容器设置适配器
        listView.setAdapter(newsAdpater);
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listVi"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

left_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:layout_height="match_parent">
    <!--
   解决 listView.setOnItemClickListener 事件失效
1>:原因如下:
此时 在item 区域中,event(事件)的焦点被内部 View抢占了,也就是说只有 内部的View的click事件有效,而item的事件无法被触发,所以导致 点击listview的 item 时,不能响应点击事件;

2>:解决方法如下:
在 item的根布局中添加如下属性即可:
android:descendantFocusability="blocksDescendants",表示 ViewGroup会覆盖子类控件而直接获取焦点;
    -->
    <ImageView
        android:id="@+id/btnImg"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:scaleType="fitXY"
        android:src="@mipmap/bg"
        />
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/tvH"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="我是标题"
            android:gravity="center"
            android:textSize="16sp"
            android:textStyle="bold"
            />
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tvCont"
            android:layout_marginTop="10px"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="我是内容文本asdfasdfasdfasdfasdfasdfs"
            android:textSize="12sp"
            android:textStyle=""
            />
        </ScrollView>
    </LinearLayout>
</LinearLayout>

right_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:layout_height="match_parent">
    <!--
   解决 listView.setOnItemClickListener 事件失效
1>:原因如下:
此时 在item 区域中,event(事件)的焦点被内部 View抢占了,也就是说只有 内部的View的click事件有效,而item的事件无法被触发,所以导致 点击listview的 item 时,不能响应点击事件;

2>:解决方法如下:
在 item的根布局中添加如下属性即可:
android:descendantFocusability="blocksDescendants",表示 ViewGroup会覆盖子类控件而直接获取焦点;
    -->

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="200dp"
        android:layout_height="100dp">
        <TextView
            android:id="@+id/tvH2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="我是标题"
            android:gravity="center"
            android:textSize="16sp"
            android:textStyle="bold"
            />
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/tvCont2"
                android:layout_marginTop="10px"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="我是内容文本asdfasdfasdfasdfasdfasdfs"
                android:textSize="12sp"
                android:textStyle=""
                />
        </ScrollView>
    </LinearLayout>

    <ImageView
        android:id="@+id/btnImg2"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:scaleType="fitXY"
        android:src="@mipmap/bg"
        />
</LinearLayout>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1239764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯物联网_STM32L071_2_继电器控制

CubeMX配置&#xff1a; Function.c及Function.h&#xff1a; #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

O2OA(翱途)开发平台 V8.2已发布,更安全、更高效、更开放

尊敬的 O2OA (翱途) 平台合作伙伴、用户以及亲爱的开发小伙伴们&#xff0c;V8.2 版本已正式发布&#xff0c;大家可以去官网上下载最新版本。 上次 8.1 的发布是在 9 月 1 日&#xff0c;又过去两个多月&#xff0c;O2OA 研发团队始终踏踏实实地做好产品的研发及优化工作&…

01背包与完全背包学习总结

背包问题分类见下图 参考学习点击&#xff1a;代码随想录01背包讲解 01背包问题&#xff1a; 核心思路&#xff1a; 1、先遍历物品个数&#xff0c;再遍历背包容量。因为容量最先是最大的&#xff0c;往背包里放物品&#xff0c;所以背包容量在慢慢减少&#xff0c;但背包容量…

【数据结构】动态顺序表详解

目录 1.顺序表的概念及结构 2.动态顺序表的实现 2.1创建新项目 2.2动态顺序表的创建 2.3接口的实现及测其功能 2.3.1初始化 2.3.2尾插 2.3.3头插 2.3.4尾删&头删 2.3.5打印&从任意位置插入 2.3.6删除任意位置的数据 2.3.7查找 2.3.8销毁顺序表 3.结语 He…

AIGC,ChatGPT AI绘画 Midjourney 注册流程详细步骤

AI 绘画,Midjourney完成高清图片绘制,轻松掌握AI工具。 前期准备: ① 一个能使用的谷歌账号 ② 可以访问外网 Midjourney注册 1.进入midjourney官网https://www.midjourney.com 点击左下角”Join the Beta”,就可以注册,第一次使用的小伙伴会弹出提示,只需要点击Acc…

Python开发运维:Celery连接Redis

目录 一、理论 1.Celery 二、实验 1.Windows11安装Redis 2.Python3.8环境中配置Celery 三、问题 1.Celery命令报错 2.执行Celery命令报错 3.Win11启动Celery报ValueErro错误 一、理论 1.Celery (1) 概念 Celery是一个基于python开发的分布式系统&#xff0c;它是简单…

Nevron Vision for .NET 2023.1 Crack

Nevron Vision for .NET 适用于桌面和 Web 应用程序的高级数据可视化 Nevron Vision for .NET提供最全面的组件&#xff0c;用于构建面向 Web 和桌面的企业级数据可视化应用程序。 该套件中的组件具有连贯的 2D 和 3D 数据可视化效果&#xff0c;对观众产生巨大的视觉冲击力。我…

Vue3常用操作

一、Vue3项目构建 1、安装最新版本vue npm create vuelatest 2、选择需要的配置 3、进入项目 cd 项目名称 4、下载依赖 npm install 5、启动项目 npm run dev

oracle面试相关的,Oracle基本操作的SQL命令

文章目录 数据库-Oracle〇、Oracle用户管理一、Oracle数据库操作二、Oracle表操作1、创建表2、删除表3、重命名表4、增加字段5、修改字段6、重名字段7、删除字段8、添加主键9、删除主键10、创建索引11、删除索引12、创建视图13、删除视图 三、Oracle操作数据1、数据查询2、插入…

MySQL面试,MySQL事务,MySQL锁,MySQL集群,主从,MySQL分区,分表,InnoDB

文章目录 数据库-MySQLMySQL主从、集群模式简单介绍1、主从模式 Replication2、集群模式3、主从模式部署注意事项 UNION 和 UNION ALL 区别分库分表1.垂直拆分2、水平拆分 MySQL有哪些数据类型1、整数类型**&#xff0c;2、实数类型**&#xff0c;3、字符串类型**&#xff0c;4…

【西行纪年番】孙悟空对战阴界王,素衣奄奄一息,巨灵拳霸气一击

Hello,小伙伴们&#xff0c;我是拾荒君。 《西行纪年番》第20集已更新。为了救回素衣&#xff0c;孙悟空想尽办法&#xff0c;最后他拜托沙悟净帮忙&#xff0c;终于成功把自己传送到阴界。原来&#xff0c;素衣的魂魄被阴界王藏在了他制造的人偶之中。沙悟净提醒孙悟空必须在…

为UE和Unity开发者准备的Godot指南

为UE和Unity开发者准备的Godot指南 ——两位大哥打架&#xff0c;请带上我 这两天游戏行业又开始热闹了&#xff0c;昨天两条信息直接刷爆朋友圈&#xff0c;最大的两家游戏引擎公司怼起来了。 《为Unity开发者准备的虚幻引擎指南》&#xff1a; 为Unity开发者准备的虚幻引擎指…

不存在类型变量 A, T 的实例,使 Collector<T, A, List<T>> 符合 Supplier<R>

报错信息 原因: 不存在类型变量 A, T 的实例&#xff0c;使 Collector<T, A, List<\T>> 符合 Supplier<\R> 来源 测试Stream流的map方法&#xff0c;做算法习惯基本类型定义数组。 map方法:Stream API的一部分。允许以一种声明式的方式处理数据&#xff0c…

Shell判断:模式匹配:case(三)

系统管理工具箱 1、需求&#xff1a;Linux提供的丰富的管理命令&#xff0c;用户管理&#xff0c;内存管理&#xff0c;磁盘管理&#xff0c;进程管理&#xff0c;日志管理&#xff0c;文件管理&#xff0c;软件管理&#xff0c;网络管理等等数十个工具包。如果你能通过shell编…

大二第五周总结

你知道的&#xff0c;向来如此&#xff0c;从来没人关心&#xff0c;世人从来只看重结果。对你了解越多的人&#xff0c;往你心里面捅刀子的时候也是最狠&#xff0c;不过跟之前不一样了&#xff0c;又不是曾经那个任人欺负的小孩儿了&#xff0c;所有的努力在别人眼里就是屁都…

【资深硬件工程师总结-千兆以太网设计指南】

文章目录 01通用PCB布线指南02标志焊盘中的接地过孔区示例03EMI注意事项04ESD注意事项 资深硬件工程师总结-千兆以太网设计指南 本应用笔记旨在帮助客户使用Microchip的10/100/1000 Mbps以太网器件系列设计PCB。本文档提供有关PCB布线的建 议&#xff0c; PCB 布线是保持信号完…

hp惠普Victus Gaming Laptop 15-fa1025TX/fa1005tx原装出厂Win11系统ISO镜像

光影精灵9笔记本电脑原厂W11系统22H2恢复出厂时开箱状态一模一样 适用型号&#xff1a;15-fa1003TX&#xff0c;15-fa1005TX&#xff0c;15-fa1007TX&#xff0c;15-fa1025TX 链接&#xff1a;https://pan.baidu.com/s/1fBPjed1bhOS_crGIo2tP1w?pwduzvz 提取码&#xff1a…

10、信息打点——APP小程序篇抓包封包XP框架反编译资产提取

APP信息搜集思路 外在——抓包封包——资产安全测试 抓包&#xff08;Fiddle&茶杯&burp&#xff09;封包&#xff08;封包监听工具&#xff09;&#xff0c;提取资源信息 资产收集——资源提取——ICO、MAD、hash——FOFA等网络测绘进行资产搜集 外在——功能逻辑 内在…

Spring Cloud学习(十一)【深入Elasticsearch 分布式搜索引擎03】

文章目录 数据聚合聚合的种类DSL实现聚合RestAPI实现聚合 自动补全拼音分词器自定义分词器自动补全查询completion suggester查询RestAPI实现自动补全 数据同步数据同步思路分析实现elasticsearch与数据库数据同步 集群搭建ES集群创建es集群集群状态监控创建索引库1&#xff09…

7种SQL的进阶用法

1.自定义排序&#xff08;ORDER BY FIELD&#xff09; 在MySQL中ORDER BY排序除了可以用ASC和DESC之外&#xff0c;还可以使用自定义排序方式来实现。 CREATE TABLE movies ( id INT PRIMARY KEY AUTO_INCREMENT, movie_name VARCHAR(255), actors VARCHAR(255), price DEC…