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

Posted Kid_TH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
        }
    }

运行效果:
技术分享
明显看到刷新并且成功增加选项,这就是滚动事件的监听。
























以上是关于Android-ListView两种适配器以及事件监听的主要内容,如果未能解决你的问题,请参考以下文章

13.Android-ListView使用BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用

android-ListView使用技巧以及优化

android - listview 按位置获取项目视图

Android-listview控件

Android-Listview中Bitmap的缓存实现有哪些方式

Android - ListView 在到达结束时加载更多项目[关闭]