Android-ListView两种适配器以及事件监听

Android-ListView两种适配器



ListView在安卓App中非常常见,几乎每一个App都会有涉及,比如QQ消息列表,或者是

通讯录还有就是酷我音乐的歌曲列表都是ListView、继承ListView。所以非常重要。

这就是ListView



ArrayAdapter

数据源是数据或者集合,比较简单

布局文件

<?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"
              android:orientation="vertical"
    >

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

    </ListView>

</LinearLayout>

主活动:

package com.xieth.as.listviewdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends AppCompatActivity {

    private ListView listView = null;
    private ArrayAdapter<String> arr_adapter = null;
    private SimpleAdapter sim_adapter = null;

    // arrayAdapter的数据源
    private String[] data = {"软件技术", "网络技术", "信息技术", "计算机应用技术", "软件工程技术", "项目文档写作"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        initViews();
        eventsViews();
    }

    private void eventsViews() {
        // 构造适配器
        arr_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
        // 加载适配器
        listView.setAdapter(arr_adapter);
    }

    private void initViews() {
        listView = (ListView) findViewById(R.id.id_listview);
    }

}

运行效果:



SimpleAdapter

数据源是集合里面包含着哈希表。

那么使用SimpleAdapter就不使用安卓自带的布局,我们要自定义一个布局文件。

listview_item.xml

<?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"
                android:padding="10dp"
    >

    <ImageView
        android:id="@+id/id_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/chat_tool_audio"
        />

    <TextView
        android:id="@+id/id_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/id_image"
        android:text="这是描述"
        android:textColor="@android:color/background_dark"
        />

</RelativeLayout>

主活动:

package com.xieth.as.listviewdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private ListView listView = null;
    private ArrayAdapter<String> arr_adapter = null;
    private SimpleAdapter sim_adapter = null;

    // arrayAdapter的数据源
    private String[] data = {"软件技术", "网络技术", "信息技术", "计算机应用技术", "软件工程技术", "项目文档写作"};

    // SimpleAdapter的数据源
    private int[] picId = {R.mipmap.chat_tool_audio, R.mipmap.chat_tool_camera, R.mipmap.chat_tool_location
            ,R.mipmap.chat_tool_photo, R.mipmap.chat_tool_send_file, R.mipmap.chat_tool_video};
    private List<Map<String, Object>> dataList = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        initViews();
        eventsViews();
    }

    private List<Map<String, Object>> getDara(){
        for (int i = 0; i < picId.length; i++) {
            Map<String, Object> map = new HashMap<>();
            map.put("pic", picId[i]);
            map.put("text", "这是描述" + i);
            dataList.add(map);
        }
        return dataList;
    }

    private void eventsViews() {
        // 构造适配器
        arr_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
        // 加载适配器
        //listView.setAdapter(arr_adapter);

        // SimpleAdapter
        sim_adapter = new SimpleAdapter(this, getDara(), R.layout.listview_item,
                    new String[] {"pic", "text"}, new int[] {R.id.id_image, R.id.id_text});
        listView.setAdapter(sim_adapter);
    }

    private void initViews() {
        listView = (ListView) findViewById(R.id.id_listview);
        dataList = new ArrayList<Map<String, Object>>();
    }

}

运行效果:


监听ListView的Item选项事件



实现AdapterView.OnItemClickListener, AbsListView.OnScrollListener

选项点击事件和ListView滚动事件

 // 监听事件
 listView.setOnItemClickListener(this);
 listView.setOnScrollListener(this);

实现点击事件的方法

    // 点击事件
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String text = listView.getItemAtPosition(position)+"";
        Toast.makeText(this, "position->" + position + "\ntext->" +                                                    text,Toast.LENGTH_SHORT).show();
    }

运行效果:



然后就是滚动事件,所以增加几个选项:

private List<Map<String, Object>> getDara(){
        for (int i = 0, t = 0; t < picId.length*2; i++, t++) {
            Map<String, Object> map = new HashMap<>();
            if (i >= picId.length) i = i/10;
            map.put("pic", picId[i]);
            map.put("text", "这是描述" + t);
            dataList.add(map);
        }
        return dataList;
    }

效果:



AbsListView.OnScrollListener滚动事件

首先呢,ListView的滚动有三种状态

1:静止状态,SCROLL_STATE_IDLE

2:手指滚动状态,SCROLL_STATE_TOUCH_SCROLL

3:手指不动了,但是屏幕还在滚动状态,也就是力道还在,依靠惯性。SCROLL_STATE_FLING


//滚动事件

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch (scrollState) {
            case SCROLL_STATE_FLING:
                Toast.makeText(this, "惯性在动", Toast.LENGTH_SHORT).show();
                break;
            case SCROLL_STATE_IDLE:
                Toast.makeText(this, "停止滑动", Toast.LENGTH_SHORT).show();
                break;
            case SCROLL_STATE_TOUCH_SCROLL:
                Toast.makeText(this, "手指在滑动", Toast.LENGTH_SHORT).show();
                break;
        }
    }

运行效果:

可以看到,我首先是用鼠标点住滑动,然后停止,第二次是用力拉动,分别打印出手指滑动,惯性在动,到

最后的停止滑动。



为了更加直观的显示,可以刷新ListView的列表项。


    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        boolean f = false;
        switch (scrollState) {
            case SCROLL_STATE_FLING:
                break;
            case SCROLL_STATE_IDLE:
                // 判断滚动到底部
                if (view.getLastVisiblePosition() == (view.getCount() - 1)) {
                    f = true;
                }
                break;
            case SCROLL_STATE_TOUCH_SCROLL:
                if (f) {
                    Map<String, Object> map = new HashMap<>();
                    map.put("pic", R.mipmap.chat_tool_audio);
                    map.put("text", "这是新增加的选项");
                    dataList.add(map);
                    sim_adapter.notifyDataSetChanged();
                }
                break;
        }
    }

运行效果:

明显看到刷新并且成功增加选项,这就是滚动事件的监听。


时间: 2024-08-25 06:47:13

Android-ListView两种适配器以及事件监听的相关文章

Android实现Button按钮点击事件监听的几种方式

工作中的项目通常有多个人一起开发,而每个人都有每个人的代码风格,不注重代码规范通常是前人挖坑,后人采坑,降低项目开发效率及加大维护难度,这里分享几种安卓按钮点击事件监听的实现方式. 方式一:直接在Activity中实现View.OnClickListener接口,重写onClick方法,提供所有按钮监听事件入口.这是实际项目中最常用的方式,尤其在页面有多个按钮的情况下比较适用. package com.example.myapp; import android.app.Activity;impo

Android ListView两种长按弹出菜单方式

* 知识点1:ListView item:两种长按弹出菜单方式* 知识点2:ListView SimpleAdapter的使用*  知识点 3:在java代码中创建一个ListView*/ -----------------------------------------------------Activity[mw_shl_code=java,true]package org.gxl.com; public class ListOnLongClickActivity extends Activ

【Android】两种适配器的使用

ArrayAdapter适配器: (1)用于显示基本的文字内容 (2)基本使用过程:新建适配器---创建或加载数据源---适配器加载数据源---视图加载适配器 ArrayAdapter(上下文,当前ListView加载的每一个列表项所对应的布局文件,数据源) (ArrayAdapter)数据适配器的实现过程: 1.新建适配器 arr_adapter=new ArrayAdapter<String>(context,布局文件,数据源) arr_adapter=new ArrayAdapter&l

iOS学习之UISwitch控件两种使用方法和监听

一.第一种创建UISwitch控件的方法,在代码中动态创建. 1.打开Xcode  4.3.2, 新建项目Switch,选择Single View Application. 2.打开ViewController.m文件在viewDidLoad方法里添加代码: - (void)viewDidLoad{ [super viewDidLoad]; UISwitch *switchButton = [[UISwitch alloc] initWithFrame:CGRectMake(50, 100, 2

Android实战简易教程-第十五枪(实现ListView中Button点击事件监听)

1.main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" androi

Spring Boot实践——事件监听

借鉴:https://blog.csdn.net/Harry_ZH_Wang/article/details/79691994 https://blog.csdn.net/ignorewho/article/details/80702827     https://www.jianshu.com/p/edd4cb960da7 事件监听介绍 Spring提供5种标准的事件监听: 上下文更新事件(ContextRefreshedEvent):该事件会在ApplicationContext被初始化或者

Zookeeper 事件监听 - 史上最详解读

目录 写在前面 1.1. Curator 事件监听 1.1.1. Watcher 标准的事件处理器 1.1.2. NodeCache 节点缓存的监听 1.1.3. PathChildrenCache 子节点监听 1.1.4. Tree Cache 节点树缓存 写在最后 疯狂创客圈 亿级流量 高并发IM 实战 系列 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 写在前面 ? 大家好,我是作者尼恩.目前和几个小伙伴一起,组织了一个高并发的实战社群[疯狂创客

zookeeper中的事件监听--cache篇

最近有接触zookeeper,有用到一部分的功能,所以在这里简单记录一下: Curator中事件的监听 原生zookeeper的事件监听采用Watcher实现,不过Watcher监听是一次性的,如果需要继续监听该事件,必须重新注册. Curator中采用cache来封装了对事件的监听,在包org.apache.curator.framework.recipes.cache封装了3种类型的事件监听. cache 分为三种(其实就是从不同的维度去解析cache): 1.PathChildrenCac

Android listview的适配器以及各种监听、效率的提升

之前写过一篇关于listview的博客,现在感觉那篇博客关于listview认识不够全面.但有些方法还是可取,例如灵活的监听,写适配器.链接在这里android listview长按,单击各种事件捕捉.那个单击监听是一项项设置监听,效率也不好. 不断工作的过程,也是不断总结过程.现在对于listview有了更透彻的理解,所以重新写了一个实践demo.这个demo有涉及到listview的数据源,布局,适配器以及各种监听.效率的提升.现在对于这些理解,想写出一个通用的适配器,但发现还是有点困难,就