Android : ListView + BaseAdapter-2简单应用

 ​​容器与适配器:​​​​​        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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7 使用pugixml 库

安装 pugixml Git下载地址&#xff1a;https://github.com/zeux/pugixml 步骤1&#xff1a;首先&#xff0c;你需要下载pugixml 的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2&#xff1a;下载完成后&#xff0c;需要将源代码解压…

【MySQL】多表查询、子查询、自连接、合并查询详解,包含大量示例,包你会。

复合查询 前言正式开始一些开胃菜多表查询自连接子查询单行子查询多行子查询in关键字all关键字any关键字多列子查询在from中使用子查询 合并查询union 和 union all 前言 我前面博客讲的所有的查询都是在单表中进行的&#xff0c;从这里开始就要专门针对查询这个话题进行进一步…

STM32-标准库和HAL库-不同容量系列的代码移植

使用STM32单片机过程中经常会涉及到不同芯片间的代码转换&#xff0c;手头上熟悉的工程需要稍作处理才能用到新的板子上。常见的是STM32F103xE、STM32F103xC&#xff08;大容量&#xff09;和STM32F103x8、STM32F103xB&#xff08;中容量&#xff09;的转换。这里做一下总结&am…

93.STL-系统内置仿函数

目录 算术仿函数 关系仿函数 逻辑仿函数 C 标准库中提供了一些内置的函数对象&#xff0c;也称为仿函数&#xff0c;它们通常位于 <functional> 头文件中。以下是一些常见的系统内置仿函数&#xff1a; 算术仿函数 功能描述&#xff1a; 实现四则运算其中negate是一元…

PTA-6-45 工厂设计模式-运输工具

题目如下&#xff1a; 工厂类用于根据客户提交的需求生产产品&#xff08;火车、汽车或拖拉机&#xff09;。火车类有两个子类属性&#xff1a;车次和节数。拖拉机类有1个子类方法耕地&#xff0c;方法只需简单输出“拖拉机在耕地”。为了简化程序设计&#xff0c;所有…

依托数据、平台、知识增强等优势 夸克大模型大幅降低问答幻觉率

“大模型时代&#xff0c;夸克有巨大机会创造出革新性搜索产品。”11月22日&#xff0c;夸克大模型公布了其面向搜索、生产力工具和资产管理助手的大模型技术布局。数据显示&#xff0c;夸克千亿级参数大模型登顶C-Eval和CMMLU两大权威榜单&#xff0c;夸克百亿级参数大模型同样…

Linux-编译器

编译器 gcc-arm-linux-gnueabihf gcc-arm-linux-gnueabihf 是一个针对 ARM 架构 Linux 系统的交叉编译工具链&#xff0c;它包括了 C、C、Objective-C 和 Fortran 编译器以及一些辅助工具&#xff0c;用于将源代码编译成可在 ARM 架构的 Linux 系统上运行的二进制程序。arm架…

2023年,人工智能在医疗行业领域的应用场景

本期行业洞察将带领大家了解人工智能在医疗行业领域的应用&#xff0c;主要了解在患者治疗和运营中的应用、人工智能作为预防工具以及大型医院目前如何使用人工智能。未来的智慧医疗时代已经悄然到来。 人工智能在患者治疗和机构运营中的应用 人工智能有望彻底改变医疗护理的…

基本的弹层,点击弹出

<div class"role"><el-button type"primary" size"mini" click"showDialog true">添加角色</el-button></div><!--控制弹框的显示隐藏visible .sync可以点击X关闭弹框 --> <el-dialog width"…

C语言从入门到实战——数组和指针的强化练习题

数组和指针的强化练习题 前言1. sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对⽐ 2. 数组和指针笔试题解析2.1 一维数组2.2 字符数组2.3 二维数组 3. 指针运算笔试题解析3.1 题目1&#xff1a;3.2 题目23.3 题目33.4 题目43.5 题目53.6 题目63.7 题目7 前言…

如何解决msvcp110.dll丢失问题,分享5个有效的解决方法

最近&#xff0c;我在使用电脑时遇到了一个令人头疼的问题——msvcp110.dll丢失。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些有效的方法来修复丢失的msvcp110.dll文件。那么&#xff0c;msvcp110.dll到底是什么呢&#xff1f;…

【iOS】实现评论区展开效果

文章目录 前言实现行高自适应实现评论展开效果解决cell中的buttom的复用问题 前言 在知乎日报的评论区中&#xff0c;用到了Masonry行高自适应来实现评论的展开&#xff0c;这里设计许多控件的约束问题&#xff0c;当时困扰了笔者许久&#xff0c;特此撰写博客记录 实现行高自…

Globalsign证书

Globalsign证书是一种被广泛应用于各个领域的网络安全解决方案。它提供了一系列的功能&#xff0c;包括保证在线交易的安全性、管理大量的数字身份以及自动验证和加密等。由于其全面的安全保障功能&#xff0c;许多大型公司、云服务供应商以及互联网创业者都选择了Globalsign证…

接口自动化测试的价值是什么?

接口自动化的内容写了很多了&#xff0c;本来以为没什么东西再聊。这两天和两个不同团队的测试负责人交流&#xff0c;发现大家对于接口自动化的落地还是很多疑问&#xff0c;接口自动化到底能不能在短期内帮助到团队呢&#xff1f; 01 它不是救命稻草 自动化并不是提升效率…

大数据湖及应用平台建设解决方案:PPT全39页,附下载

关键词&#xff1a;大数据湖建设&#xff0c;集团大数据湖&#xff0c;大数据湖仓一体&#xff0c;大数据湖建设解决方案 一、大数据湖定义 大数据湖是一个集中式存储和处理大量数据的平台&#xff0c;主要包括存储层、处理层、分析层和应用层四个部分。 1、存储层&#xff…

028 - STM32学习笔记 - ADC结构体学习(二)

028 - STM32学习笔记 - 结构体学习&#xff08;二&#xff09; 上节对ADC基础知识进行了学习&#xff0c;这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef&#xff08;其中xx为外设名&#xff0c;例如…

d3dx9_43.dll缺失怎么办?教你一分钟修复d3dx9_43.dll丢失问题

今天&#xff0c;与大家分享关于“d3dx9_43.dll丢失的5个解决方法”的主题。在我们的日常生活和工作中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;而d3dx9_43.dll丢失就是其中之一。那么&#xff0c;什么是d3dx9_43.dll呢&#xff1f;它为什么会丢失&#xff1f;又该…

Ubuntu安装PCAN-View

目录 一. Hardware 二. Software 2.1 安装驱动 2.2 安装PCAN-View QA 本文介绍如何安装linux版的PCAN-View。 PCAN-View&#xff1a;用来抓包分析CAN/CANFD报文。Hardware: PEAK-System Linux generic #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct 9 15:34:04 UTC 2…

redis---主从复制及哨兵模式(高可用)

主从复制 主从复制&#xff1a;主从复制是redis实现高可用的基础&#xff0c;哨兵模式和集群都是在主从复制的基础之上实现高可用。 主从负责的工作原理 1、主节点&#xff08;master&#xff09; 从节点&#xff08;slave&#xff09;组成&#xff0c;数据复制是单向的&a…

AI原生应用为百度带来新增量

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; AI将彻底改变每一个行业!得益于AI和基础模型的驱动&#xff0c;百度在AI原生应用领域厚积薄发。 11月21日&#xff0c;百度Q3财报发布&#xff0c;数据显示&#xff1a;三季度营收达344.47亿元&…