安卓常用控件--列表视图

发布时间:2022-11-28 ANDROID

(一)列表视图概述

1、继承关系图

  • 列表视图(ListView)继承了抽象列表视图(AbsListView),而抽象列表视图又继承了适配器视图(AdapterView)。适配器视图具有共同的特征,就是利用适配器将数据源与展示控件绑定起来。
  • 在这里插入图片描述

2、列表视图API文档

  • https://developer.android.google.cn/reference/kotlin/android/widget/ListView?hl=en
    在这里插入图片描述

3、 列表视图四要素

要素说明
列表控件显示多项供用户选择
适配器数组适配器、简单适配器、游标适配器、基适配器……
数据源数组、列表、游标……
列表项模板平台资源、用户自定义
  • 列表视图四要素:列表控件、适配器、列表项模板和数据源
    在这里插入图片描述

4、四种适配器

  • 列表视图(ListView),它是AdapterView的孙子类,要通过适配器作为梁桥来绑定数据源
适配器含义
ArrayAdapter数组适配器
SimpleAdapter简单适配器
SimpleCursorAdapter简单游标适配器
BaseAdapter基适配器

(二)数组适配器

1、数组适配器API文档

https://developer.android.google.cn/reference/android/widget/ArrayAdapter?hl=en
在这里插入图片描述

2、数组适配器继承关系

  • ArrayAdapter类继承了BaseAdapter类
    在这里插入图片描述

3、数组适配器构造方法

  • 数组适配器提供了6个重载的构造方法(下面的案例中我们会学习第5种构造方法来创建数组适配器)
    在这里插入图片描述
  • 第五个构造方法参数说明
    在这里插入图片描述

(三) 基于数组适配器使用列表视图案例 —— 阅读古诗

1、创建安卓应用

  • 基于Empty Activity创建安卓应用 - ReadAnicientPoetry
    在这里插入图片描述
  • 单击【finish】按钮
    在这里插入图片描述

2、准备图片素材

  • 将背景图片拷贝到Drawable目录里
    在这里插入图片描述

3、字符串资源文件

  • 字符串资源文件strings.xml
    在这里插入图片描述
<resources>
    <string name="app_name">阅读古诗</string>

    <string-array name="titles">
        <item>静夜思</item>
        <item>登鹳雀楼</item>
        <item>相思</item>
        <item>听弹琴</item>
        <item>登乐游原</item>
        <item>朝发白帝城</item>
        <item>巴山夜雨</item>
        <item>渭城曲</item>
        <item>春夜喜雨</item>
        <item>离离原上草</item>
        <item>示儿</item>
    </string-array>

    <string-array name="authors">
        <item>唐·李白</item>
        <item>唐·王之涣</item>
        <item>唐·王维</item>
        <item>唐·刘长卿</item>
        <item>唐·李商隐</item>
        <item>唐·李白</item>
        <item>唐·杜牧</item>
        <item>唐·王维</item>
        <item>唐·杜甫</item>
        <item>唐·白居易</item>
        <item>宋·陆游</item>
    </string-array>

    <string-array name="contents">
        <item>床前明月光,\n疑是地上霜。\n举头望明月,\n低头思故乡。</item>
        <item>白日依山尽,\n黄河入海流。\n欲穷千里目,\n更上一层楼。</item>
        <item>红豆生南国,\n春来发几枝。\n愿君多采撷,\n此物最相思。</item>
        <item>泠泠七弦上,\n静听松风寒。\n古调虽自爱,\n今人多不弹。</item>
        <item>向晚意不适,\n驱车登古原。\n夕阳无限好,\n只是近黄昏。</item>
        <item>朝辞白帝彩云间,\n千里江陵一日还。\n两岸猿声啼不住,\n轻舟已过万重山。</item>
        <item>君问归期未有期,\n巴山夜雨涨秋池。\n何当共剪西窗烛,\n却话巴山夜雨时。</item>
        <item>渭城朝雨浥轻尘,\n客舍青青柳色新。\n劝君更尽一杯酒,\n西出阳关无故人。</item>
        <item>好雨知时节,当春乃发生。\n随风潜入夜,润物细无声。\n野径云俱黑,江船火独明。\n晓看红湿处,花重锦官城。</item>
        <item>离离原上草,一岁一枯荣。\n野火烧不尽,春风吹又生。\n远芳侵古道,晴翠接荒城。\n又送王孙去,萋萋满别情。</item>
        <item>死去元知万事空,\n但悲不见九州同。\n王师北定中原日,\n家祭无忘告乃翁。 </item>
    </string-array>
</resources>

4、主布局资源文件

  • 主布局资源文件activity_main.xml
    在这里插入图片描述在这里插入图片描述
  • 查看预览效果
    在这里插入图片描述

5、创建诗歌列表项模板

  • 诗歌列表项模板—poem_list_item.xml
    在这里插入图片描述在这里插入图片描述

6、主界面功能实现

  • 主界面 --MainActivity
    在这里插入图片描述
  • 声明变量
    在这里插入图片描述
  • 通过资源标识符获取控件实例
    在这里插入图片描述
  • 初始化诗歌标题数组,作为列表控件的数据源
    在这里插入图片描述
  • 创建数组适配器,作为连接列表控件与数据源的桥梁
    在这里插入图片描述
    -查看平台布局资源文件–simple_list_item_1
    在这里插入图片描述
  • 给列表控件设置适配器
    在这里插入图片描述
  • 查看完整代码
package net.hw.read_ancient_poetry;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    private ListView lvPoemTitle; // 诗歌标题列表控件 - 展示
    private ArrayAdapter<String> adapter; // 数组适配器 - 桥梁
    private String[] titles; // 诗歌标题数组 - 数据源

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);

        // 通过资源标识符获取控件实例
        lvPoemTitle = findViewById(R.id.lv_poem_title);

        // 初始化古诗标题数组,作为列表控件的数据源
        titles = getResources().getStringArray(R.array.titles);
        // 给古诗标题填上序号
        for (int i = 0;  i < titles.length; i++) {
            titles[i] = (i + 1) + ". " + titles[i];
        }

        // 创建数组适配器,作为连接列表控件与数据源的桥梁
        adapter = new ArrayAdapter<>(
                this, // 上下文 - 当前窗口
                android.R.layout.simple_list_item_1, // 列表项模板 - 平台布局资源
                titles // 数据源 - 字符串数据组
        );

        // 给列表控件设置适配器
        lvPoemTitle.setAdapter(adapter);
    }
}

7、启动应用,查看效果

  • 采用平台显示效果
    在这里插入图片描述- 修改源代码,使用自定义的列表项模板
    在这里插入图片描述

8、单击列表项,弹出吐司

  • 修改主界面类,给列表控件注册项单击监听器
    在这里插入图片描述
  • 参数position是用户单击列表项的位置,从0开始的,比如用户单击了第3个列表项,那么position就等于2,也就是说,position要加1才是行号
  • 参数id的值与参数position的值相等,两个参数只是类型不同而已

9、启动应用,查看效果

  • 单击列表项,弹出吐司
    在这里插入图片描述

10、创建内容界面

  • 基于模板创建显示古诗内容的界面 - ContentActivity
    在这里插入图片描述

  • 单击【finish】按钮
    在这里插入图片描述
    内容界面布局资源文件content_activity.xml
    字符串资源文件strings.xml

12、修改主界面类,实现窗口跳转

package net.zwj.read_ancient_poetry;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

    private ListView lvPoemTitle;//诗歌标题列表控件--展示
    private ArrayAdapter<String> adapter;//数组适配器- 桥梁
    private String[] titles;//诗歌标题数组--数据源


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //通过资源标识符获取控件实例
        lvPoemTitle=findViewById(R.id.lv_poem_title);

        //初始化诗歌标题数组,作为列表控件的数据源
        titles=getResources().getStringArray(R.array.titles);
        //给诗歌标题填上序号
        for(int i = 0; i<titles.length;i++){
            titles[i]=(i+1)+"."+titles[i];
        }
        //创建数组适配器,作为连接列表控件与数据源的桥梁
        adapter=new ArrayAdapter<>(
                this,//上下文--当前窗口
                R.layout.poem_list_item,//列表项模板--平台布局资源
                titles//数据源--字符串数据组
        );
        //给列表控件设置适配器
         lvPoemTitle.setAdapter(adapter);

         // 给列表控件注册项单击监听器
        lvPoemTitle.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Toast.makeText(MainActivity.this,
                        "你选择了古诗["+ titles[position]+"]",
                        Toast.LENGTH_SHORT).show();
                //创建意图,实现窗口跳转
                Intent intent=new Intent(MainActivity.this, ContentActivity.class);
                intent.putExtra("position".position);
                startActivity(intent);
            }
        });
    }
}

11、内容界面布局资源文件

  • 内容界面布局资源文件content_activity.xml
    在这里插入图片描述
<?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:background="@drawable/background"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="20dp"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:textColor="#ff00ff"
        android:textSize="40sp" />

    <TextView
        android:id="@+id/tv_author"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginBottom="20dp"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:textColor="#000000"
        android:textSize="25sp" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginBottom="20dp"
        android:layout_weight="8"
        android:textColor="#0000ff"
        android:textSize="30sp" />

    <Button
        android:id="@+id/btn_back"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:onClick="doBack"
        android:text="@string/back"
        android:textSize="20sp" />
</LinearLayout>

12、修改主界面类,实现窗口跳转

  • 通过意图携带数据并跳转到内容界面
    在这里插入图片描述

13、修改内容界面 ,显示古诗内容

  • 内容界面-ContentActivity
    在这里插入图片描述

  • 声明变量
    在这里插入图片描述

  • 通过资源标识符获取控件实例
    在这里插入图片描述

  • 获取窗口跳转的意图,获取意图携带的位置数据,进行相应的处理
    在这里插入图片描述

  • 编写【返回古诗目录】按钮单击事件处理方法
    在这里插入图片描述

14、启动应用,查看效果

15、查看完整源代码

(1)主界面类 - MainActivity
package net.hw.read_ancient_poetry;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

    private ListView lvPoemTitle; // 诗歌标题列表控件 - 展示
    private ArrayAdapter<String> adapter; // 数组适配器 - 桥梁
    private String[] titles; // 诗歌标题数组 - 数据源

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);

        // 通过资源标识符获取控件实例
        lvPoemTitle = findViewById(R.id.lv_poem_title);

        // 初始化古诗标题数组,作为列表控件的数据源
        titles = getResources().getStringArray(R.array.titles);
        // 给古诗标题填上序号
        for (int i = 0;  i < titles.length; i++) {
            titles[i] = (i + 1) + ". " + titles[i];
        }

        // 创建数组适配器,作为连接列表控件与数据源的桥梁
        adapter = new ArrayAdapter<>(
                this, // 上下文 - 当前窗口
                R.layout.poem_list_item, // 列表项模板 - 自定义布局资源
                titles // 数据源 - 字符串数据组
        );

        // 给列表控件设置适配器
        lvPoemTitle.setAdapter(adapter);

        // 给列表控件注册项单击监听器
        lvPoemTitle.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Toast.makeText(MainActivity.this,
                        "你选择了古诗[" + titles[position] + "]",
                        Toast.LENGTH_SHORT).show();
                // 创建实现窗口跳转的意图
                Intent intent = new Intent(MainActivity.this, ContentActivity.class);
                // 通过意图携带数据(选中的列表项位置)
                intent.putExtra("position", position);
                // 按意图启动目标组件
                startActivity(intent);
            }
        });
    }
}
(2)内容界面 - ContentActivity
package net.hw.read_ancient_poetry;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.ViewAnimator;

public class ContentActivity extends AppCompatActivity {

    private TextView tvTitle; // 标题标签
    private TextView tvAuthor; // 作者标签
    private TextView tvContent; // 内容标签
    private String[] titles; // 标题数组
    private String[] authors; // 作者数组
    private String[] contents; // 内容数组

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_content);

        // 通过资源标识符获取控件实例
        tvTitle = findViewById(R.id.tv_title);
        tvAuthor = findViewById(R.id.tv_author);
        tvContent = findViewById(R.id.tv_content);

        // 获取窗口跳转的意图
        Intent intent = getIntent();
        // 判断意图是否为空
        if (intent != null) {
            // 获取意图携带的数据
            int position = intent.getIntExtra("position", 0);
            // 获取古诗标题数组
            titles = getResources().getStringArray(R.array.titles);
            // 获取古诗作者数组
            authors = getResources().getStringArray(R.array.authors);
            // 获取古诗内容数组
            contents = getResources().getStringArray(R.array.contents);
            // 设置标题标签文本
            tvTitle.setText(titles[position]);
            // 设置作者标签文本
            tvAuthor.setText(authors[position]);
            // 设置内容标签文本
            tvContent.setText(contents[position]);
        }
    }

    /**
     * 【返回古诗目录】按钮单击事件处理方法
     *
     * @param view
     */
    public void doBack(View view) {
       finish(); // 关闭当前窗口
    }
}

(四)简单适配器

  • https://developer.android.google.cn/reference/kotlin/android/widget/SimpleAdapter?hl=en
    在这里插入图片描述

2、简单适配器继承关系图

  • SimpleAdapter类继承了BsaeAdapter类
    在这里插入图片描述

3、简单适配器构造方法

  • 简单适配器提供了一个构造方法,有5个参数
    在这里插入图片描述

(五)基于简单适配器使用列表视图案例 - 通讯录

1、创建安卓应用

  • 基于EmptyAcitivity创建安卓应用- 【Contacts】
    在这里插入图片描述

  • 单击【finish】按钮
    在这里插入图片描述

2、准备图片素材

  • 将图片素材拷贝到drawable目录
    在这里插入图片描述

3、字符串资源文件

  • 字符串资源文件strings.xml
    在这里插入图片描述
<resources>
    <string name="app_name">通讯录</string>
    <string name="icon">图标</string>
    <string name="name">姓名</string>
    <string name="phone">电话</string>
</resources>

4、主布局资源文件

  • 主布局资源文件–activity_main.xml
    在这里插入图片描述
<?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:background="@drawable/background"
    android:orientation="vertical"
    android:padding="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tvIcon"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="20dp"
            android:layout_weight="0.5"
            android:text="@string/icon"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/tvName"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/name"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/tvPhone"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.5"
            android:text="@string/phone"
            android:textSize="20sp" />
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:background="#aaaaaa" />

    <ListView
        android:id="@+id/lvContact"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">        
    </ListView>
</LinearLayout>
  • 查看预览效果
    在这里插入图片描述

5、创建联系人列表项模板

  • 联系人列表项模板 contact_list_item.xml
    在这里插入图片描述
<?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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/ivContactIcon"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_marginRight="10dp"
            android:scaleType="fitXY"
            android:src="@drawable/img1" />

        <TextView
            android:id="@+id/tvContactName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#0000ff"
            android:textSize="20sp" />
    </LinearLayout>

    <TextView
        android:id="@+id/tvContactPhone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="90dp"
        android:layout_marginBottom="10dp"
        android:textColor="#555555"
        android:textSize="16sp" />
</LinearLayout>

6、主界面类实现功能

  • 主界面类–MainActivity
    在这里插入图片描述
  • 声明变量
    在这里插入图片描述
  • 通过资源标识符获取控件实例
    在这里插入图片描述
  • 创建获取联系人列表的方法
    在这里插入图片描述
  • 初始化联系人列表
    在这里插入图片描述
  • 创建简单适配器作为桥梁
    在这里插入图片描述
  • 给列表控件设置适配器
    在这里插入图片描述

7、启动应用,查看效果

  • 单击列表项,弹出吐司
    在这里插入图片描述

8、主界面类MainActivity完整代码

9、课堂练习 - 添加列表项单击事件处理

(六)基适配器

1、基适配器API

  • https://developer.android.google.cn/reference/android/widget/BaseAdapter?hl=en
    在这里插入图片描述

2、基适配器继承关系图

  • BaseAdapter类继承了Object类,前面我们已经学习了它的两个子类:ArrayAdapter类和BaseApater类
    在这里插入图片描述

3、基适配器构造方法

  • 基适配器只提供一个无参数构造方法
    在这里插入图片描述
  • 一般会继承基适配器

(七)基于自定义适配器使用列表控件案例 - 联系人

1、创建安卓应用

  • 基于EmptyActivity创建安卓应用【ContactList】
    在这里插入图片描述
  • 单击【finish】按钮
    在这里插入图片描述
2、准备素材图片
  • 将图片素材拷贝到drawable目录
    在这里插入图片描述

3、字符串资源文件

  • 字符串资源文件strings.xml
    在这里插入图片描述

4、主布局资源文件

  • 主布局资源文件 activity_main.xml
    在这里插入图片描述
  • 查看完整代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:background="@drawable/background"
    android:padding="10dp"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

</LinearLayout>
  • 查看预览效果
    在这里插入图片描述

5、创建联系人列表项模板

  • 联系人列表项模板–contact_list_item.xml
    在这里插入图片描述
  • 查看完整代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_vertical">
        <ImageView
            android:id="@+id/iv_contacticon"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:src="@drawable/img1"
            android:layout_marginRight="10dp"
            android:scaleType="fitXY"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        <TextView
            android:id="@+id/tv_contactname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#0000ff"
            android:text="陈燕文"
            android:textSize="20sp"/>

        <TextView
            android:id="@+id/tv_contactphone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:textColor="#555555"
            android:text="15856567890"
            android:textSize="16sp"/>
    </LinearLayout>
    </LinearLayout>
</LinearLayout>
  • 查看预览效果
    在这里插入图片描述

6、创建联系人实体类

  • 联系人实体类 - Contact
    在这里插入图片描述
  • 查看完整代码
package net.hzwj.contact_list;

/**
 * 功能:
 * 作者:周雯静
 * 日期:2022年11月28日
 */
public class Contact {
    private int icon;
    private String name;
    private String phone;

    public int getIcon() {
        return icon;
    }

    public void setIcon(int icon) {
        this.icon = icon;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "Contact{" +
                "icon=" + icon +
                ", name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}

7、创建联系人适配器

  • 联系人适配器 ContactAdapter
    在这里插入图片描述
  • 继承基适配器,空实现四个抽象方法
    在这里插入图片描述
  • 声明变量
    在这里插入图片描述
  • 创建构造方法
    在这里插入图片描述
  • 获取列表项个数方法-getCount()在这里插入图片描述
  • 获取列表项-getItem()
  • 在这里插入图片描述
  • 获取列表项标识符方法
    在这里插入图片描述
  • 获取列表项视图方法
    在这里插入图片描述

8、主界面类实现功能

  • 主界面类-- MainActivity
    在这里插入图片描述

  • 声明变量
    在这里插入图片描述

  • 通过资源标识符获取控件实例
    在这里插入图片描述

  • 创建获取联系人方法

在这里插入图片描述

  • 获取联系人列表作为数据源
    在这里插入图片描述

  • 创建联系人适配器
    在这里插入图片描述

  • 给联系人列表控件设置适配器
    在这里插入图片描述

  • 给联系人列表控件注册项单击监听器
    在这里插入图片描述

  • 查看完整源代码

package net.hzwj.contact_list;

import androidx.appcompat.app.AppCompatActivity;

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

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

public class MainActivity extends AppCompatActivity {

    private ListView lvContact;
    private ContactAdapter adapter;
    private List<Contact> contacts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        lvContact = findViewById(R.id.lv_contact);

        contacts = getContacts();

        adapter = new ContactAdapter(this, contacts);
        lvContact.setAdapter(adapter);

        lvContact.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Contact contact = contacts.get(position);
                Toast.makeText(MainActivity.this,
                        contact.getName() + ":" + contact.getPhone(),
                        Toast.LENGTH_SHORT).show();

            }
        });
    }
    private List<Contact> getContacts() {
        // 声明联系人列表
        List<Contact> contacts = new ArrayList<>();

        // 声明联系人
        Contact contact = null;

        // 创建第1个联系人
        contact = new Contact();
        contact.setIcon(R.drawable.img1);
        contact.setName("李红梅");
        contact.setPhone("15895953456");
        // 将联系人添加到联系人列表
        contacts.add(contact);

        // 创建第2个联系人
        contact = new Contact();
        contact.setIcon(R.drawable.img2);
        contact.setName("王晓玲");
        contact.setPhone("13956572345");
        // 将联系人添加到联系人列表
        contacts.add(contact);

        // 创建第3个联系人
        contact = new Contact();
        contact.setIcon(R.drawable.img3);
        contact.setName("唐语涵");
        contact.setPhone("15845891234");
        // 将联系人添加到联系人列表
        contacts.add(contact);

        // 创建第4个联系人
        contact = new Contact();
        contact.setIcon(R.drawable.img4);
        contact.setName("佟大为");
        contact.setPhone("13934345680");
        // 将联系人添加到联系人列表
        contacts.add(contact);

        // 创建第5个联系人
        contact = new Contact();
        contact.setIcon(R.drawable.img5);
        contact.setName("钟小翠");
        contact.setPhone("15890904520");
        // 将联系人添加到联系人列表
        contacts.add(contact);

        // 创建第6个联系人
        contact = new Contact();
        contact.setIcon(R.drawable.img6);
        contact.setName("张三丰");
        contact.setPhone("13890985670");
        // 将联系人添加到联系人列表
        contacts.add(contact);

        // 创建第7个联系人
        contact = new Contact();
        contact.setIcon( R.drawable.img7);
        contact.setName("刘玉玲");
        contact.setPhone( "15895673450");
        // 将联系人添加到联系人列表
        contacts.add(contact);

        // 返回联系人列表
        return contacts;
    }

}

9、启动应用,查看效果

  • 单击列表项,弹出吐司
    在这里插入图片描述

10、优化联系人适配器代码 - 让列表项视图复用

在这里插入图片描述

11、启动应用,查看效果

12、查看完整代码

(1)联系人适配器 - ContactAdapter (2)主界面类 - MainActivity

更多相关推荐


安卓基础概述

发布时间:2016-09-26 ANDROID
安卓基础知识学习(内容太多只阐述知识点基础部分三部分:配置文件,布局,java代码前期主要学习一下布局,以及基本的控件使用配置文件AndroidManifest.xml包名SDK依赖信息&lt;uses-sdkandroid:minSdkVersion="11"android:targetSdkVersion="23"/&gt;权限依赖application基本&lt;applicationand...

教你写Android ImageLoader框架之基本架构

发布时间:2018-11-14 IMAGELOADER ANDROID
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!                  前言     在Android开发中,ImageLoader应该算得上是最重要的开源库之一,由于项目原因(不能使用开源库),前段时间自己也是需要实现一个简单的ImageLoad...

// android imageloader 的使用

发布时间:2016-12-30 ANDROID
主页:https://github.com/nostra13/Android-Universal-Image-Loader使用步骤:添加依赖:compile‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’添加权限:- - 在Application或Activity中进行初始化配置//ImageLoaderConfigu...

【WLAN】SSID为空导致添加隐藏的网络,不在WLAN列表界面显示,但是状态栏中可以显示出来

发布时间:2022-11-22 WEBVIEW ANDROID JAVA WIFI
代码路径:frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java此文件主要是跟踪已保存或可用的wifi网络及其状态修改方法:针对已连接状态的AP,如果SSID是空的,可以重新给予SSID信息,便于在WLAN列表界面显示出来.---a/packages/SettingsLib/src...

自定义View的实现方法

发布时间:2014-04-12 ANDROID UI
当开发者打算派生自定义的UI组件时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法即可。通常可以被用户重写的方法如下:构造器:重写构造器是定制View的最基本方式。当Java代码创建一个View实例,或根据XML布局文件加载并构造界面时将需要调用该构造器。onFinishlnflate():这是一个回调方法。当应用从XML布局文件加载该组件并利用它来构建界面之后,该方法将会...

android 手电筒 代码

发布时间:2014-02-12 程序 ANDROID 源代码
packagecom.lhw.light;importandroid.app.Activity;importandroid.graphics.Color;importandroid.hardware.Camera;importandroid.hardware.Camera.Parameters;importandroid.os.Bundle;importandroid.view.KeyEvent;...

Android解决全屏开发状态栏隐藏问题

发布时间:2022-11-17 ANDROID ANDROID开发问题记录
前言近期新接手了一个小项目需要设计全屏页面,也就是不展示页面toolbar以及手机状态栏,就是显示电量手机信息那一栏,下面是解决思路历程。一、踏入误区刚开始查阅资料,有说在配置清单改变,也有说在Activity设置xml之前配置全屏的,测试了一下全屏是可以全屏,但是页面高度改变信息栏又出来了,而且极不稳定,比如页面设置全屏后,点击页面的输入框高度发生变化,就把状态栏给弹出来了。还想着是输入框事件的...

《Android内核剖析》读书笔记 第13章 View工作原理【View重绘过程】

发布时间:2014-07-02 ANDROID
计算视图大小的过程(Measure)视图大小,准确的来说应该是指视图的布局大小;我们在layout.xml中为每个UI控件设置的layout_width/layout_height两个属性被用来设置父视图给当前视图分配的“窗口”大小,为了开发的方便和对不同屏幕分辨率的兼容适配对这两个参数的赋值一般都使用相对值(也可以使用具体值,比如100dp),比如WRAP_CONTENT/MATCH_PAREN...

阿里开源《Android架构开发手册》探索Android架构师技术成长之路

发布时间:2022-11-22 ANDROID 架构 技术提升
架构是以组件、组件之间的关系、组件与环境之间的关系为内容的某一系统的基本组织结构,以及指导内容涉及与演化的原理。Android架构从下往上依次为:**Linux内核层、系统库和Android运行时环境、framework层和应用层这四层架构。**Android的架构模式,更多代表的是其存在的意义、角色的划分规则及角色之间的通信。对于Android开发者来说,常见的架构模式基本上就是三种,分别是MV...

Android网络编程之sax解析xml

发布时间:2015-02-19 网络 ANDROID SAX解析
SAX采用事件驱动机制来解析XML文档,每当SAX解析器发现文档开始、元素开始、文本、元素结束、文档结束等事件时,就会向外发送一次事件,而开发者则可以通过编写事件监听器处理这些事件,以此来获取XML文档里的信息。SAX解析方式占用内存小,处理速度非常快。sax解析的代码步骤第一步:新建一个工厂类SAXParserFactory,代码如下:SAXParserFactoryfactory=SAXPar...

android studio 升级为小海豚版本带来的 namespace 问题解决

发布时间:2022-11-14 ANDROID STUDIO ANDROID NAMESPACE GRADLE
namespace这个其实不是studio的升级带来的,是gradle版本在7.4及以上出现的,因为我们的项目最后发版applicationId不会使用包名,会更改,7.4版本以上就会出现这个namespace,如果更改applicationId与namespace不一致就会导致问题,更改为一样的,但与实际包名不一致也会进行报错,开始没有时间细研究这个问题,只是对gradle进行降版本操作今天实际...

爱心发射代码带名字升级版

发布时间:2022-11-18 ANDROID HTML PYTHON OPENCV JAVA
上次的爱心发射发出来之后,群友想问能不能把心爱的人名字放在爱心中间。当然没问题啊,于是我就改了改代码,让女神王铁蛋显示在爱心中间,同时还可以在屏幕上飘动满屏的王铁蛋,大大小小、快快慢慢的王铁蛋。这还拿不下王铁蛋?话不多说,直接上效果图。背景颜色,爱心颜色,爱心中间的名字,飘动的名字,字体,大小,飘动速度全都可以换成自己想要的,已经把改动方法写到了代码注释里。改动方法在这里:varwords_att...

android--百度地图

发布时间:2019-05-05 ANDROID
cd~cd.android获取sha1创建百度androidkey下载sdk 解压缩copy到libs文件夹下右键 addaslibary创建一个类继承ApplicationSDKInitializer.initialize(this);//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐...

Android 应用内存优化之图片优化

发布时间:2016-08-01 移动 开发 ANDROID
网上有很多大拿分享的关于Android性能优化的文章,主要是通过各种工具分析,使用合理的技巧优化APP的体验,提升APP的流畅度,但关于内存优化的文章很少有看到。今天在微信订阅号中无意看到这文章,感觉写得挺不错,就弄过来,给大家分享下。在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮、背...

AMD CPU无法安装Intel HAXM解决方法

发布时间:2022-11-13 ANDROID
步骤1. 步骤2.   找到安装目录(我的安装目录:D:\Android\SDK\extras\google\Android_Emulator_Hypervisor_Driver)下的这个文件:silent_install,右击该文件选择“以管理员运行”,即可。...

最简单的观察者模式纯JAVA实现

发布时间:2016-10-31 用JAVA实现观察者 ANDROID
温故知新首先我们定义两个接口:一个是观察者有一个方法updata();接收被观察者改变后发送过来的消息,另一个是观察者有三个方法添加观察者1、addWather(Watcherwatcher)删除观察者2、removeWather(Watcherwather)给观察者发送消息3、notify(Stringstr)观察者接口:packageInterface;/***观察者接口*@authorhu*...

Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之四

问题点6:AndroidBLE具体连接flow并问询DB的APIflow之第三、四阶段问询;--&gt;此时开始进行第三阶段:通过“ReadByTypeRequest”+AttributeType:PnPID”问询类似BR/EDR中的DI信息;(这一步的实现比较隐晦),还没有彻底梳理流程,这里就不乱写,免得误导。对应的opcode是:GATT_REQ_READ_BY_TYPE(0x08)对应的At...

个人收入理财App的设计与实现

目录摘要IAbstractII1绪论11.1选题背景及意义11.1.1研究背景11.1.2目的和意义11.2国内外现状和发展趋势21.4研究主要内容32设计开发所用到的工具和技术42.1系统开发工具42.2Eclipse的介绍42.3Android简介52.4安卓技术52.5SQLite简介63系统分析83.1经济可行性分析83.2技术可行性分析83.3系统业务流程分析83.4系统需求分析93.5...

Android Studio4以后gradle报Could not install Gradle distribution from ‘https://services.gradle.org/dist

发布时间:2022-08-29 ANDROID STUDIO ANDROID GRADLE
 网上说的手动下载配置gradle,关防火墙,梯子,都解决不了的情况下可以试试这个方法我的情况是Gradle报CouldnotinstallGradledistributionfrom‘https://services.gradle.org/distribution然后同时pluglns下marketplace一直连不上网上说的一些选项都是3.0版本的,4的都没有解决方法如下:1、设置File|S...

【我的Android进阶之旅】 Google Developers中国网站发布啦!

发布时间:2016-12-08 ANDROID 进阶
今天,GoogleDevelopers中国网站(https://developers.google.cn)正式发布!GoogleDevelopers中国网站是特别为中国开发者而建立的,它汇集了Google为全球开发者所提供的开发技术资源,包括API文档、开发案例、技术培训的视频。并涵盖了以下关键开发技术和平台产品的信息:打开https://developers.google.cn/products...

迅为iTOP3568开发板Android11获取root权限关闭selinux

发布时间:2022-11-21 ANDROID RK3568开发板
本文档所需资料在网盘资料“iTOP-3568开发板\02_【iTOP-RK3568开发板】开发资料\06_Android系统开发配套资料\02_Android11获取root权限配套资料”目录下。本文档参考瑞芯微官方文档,在源码“Android11/rk_android11.0_sdk/RKDocs/android/patches/root”目录下。1.2.1关闭selinux修改device/r...

android开发,使用kotlin学习Lifecycles

发布时间:2022-10-06 学习 ANDROID KOTLIN
  Lifecycles组件可以让任何一个类都能轻松感知到Activity的生命周期,同时又不需要在Activity中编写大量的逻辑处理。Lifecycles的简单使用:新建一个MyObserver类,并让它实现LifecycleObserver接口,在方法上使用@OnLifecycleEvent注解,并传入了一种生命周期事件,生命周期事件的类型一共又七种:ON_CREATE、ON_START、O...

Kotlin学习教程(七)

Kotlin学习教程(七)这篇文章主要学习下lambda表达式。因为后续一些例子会用到。“Lambda表达式”(lambdaexpression)其实就是匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambdaabstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。Java8的一个大亮点是...

《第一行代码》核心知识点:Android简介

前言自本文开始,我将更新《第一行代码Android第2版.pdf》,(提取码:n5ag)核心要点系列,通过阅读本系列文章可以帮助有Android基础的开发人员,去除冗余的基础讲解,直击核心知识点,以最短的时间,快速提升Android内功。一、Android简介2003年10月,AndyRubin等人一起创办了Android公司。2005年8月谷歌收购了这家仅仅22个月的公司,并让AndyRubin...

自动化测试如何解决日志问题?

前言有粉丝问了一个自动化测试实践中遇到的问题:持续集成的自动化用例很多,测试环境日志level为debug,日志量大概40G/每天,定位问题时日志查询很慢,该怎么解决?这个问题可以说是自动化测试实践中经常遇到的问题,那么该如何解决这些问题呢?或者说有没有更好的方案来优化这些问题?这篇文章,我想聊聊我的看法。             日志作用在聊日志处理之前,先来看看日志的作用。日志的本质就是记录系...

Android Studio 的过往版本

发布时间:2022-11-21 ANDROID STUDIO ANDROID
本文转自AndroidStudio的过往版本 | Android开发者 | AndroidDevelopers本页面列出了AndroidStudio之前的每个主要版本的新功能和改进。如需了解最新版本的新功能,请参阅当前的 AndroidStudio版本说明。如需了解与发布版本有关的最新资讯(包括每个预览版中的重要修正的列表),请参阅版本更新。如需了解AndroidGradle插件中的新变化,请参阅...

一文吃透接口调用神器RestTemplate

发布时间:2021-10-31 ANDROID PYTHON SPRING BOOT JAVA SPRING
文末可以领取所有系列高清pdf。大家好,我是路人,这是SpringMVC系列第21篇。本文介绍Springweb中特别牛逼的一个类RestTemplate。目录1、RestTemplate概述2、案例代码2.1、git地址2.2、关键代码位置2.3、如何运行测试用例?3、发送Get请求3.1、普通请求3.2、url中含有动态参数3.3、接口返回值为泛型3.4、下载小文件3.5、下载大文件3.6、传...

Qt Android OpenSSL

发布时间:2022-11-16 QT ANDROID SSL
转载https://github.com/KDAB/android_opensslAndroidOpenSSLsupportforQtOpenSSLscriptsandbinariesforAndroid(usefulforQtAndroidapps)InthisrepoyoucanfindtheprebuiltOpenSSLlibsforAndroidandaqmakeincludeprojec...

值得一看的Perfetto分析进阶

发布时间:2022-11-19 ANDROID
【阅读推荐】一文看懂Linux页表、大页与透明大页Linux用户空间与内核空间(理解高端内存)需要多久才能看完linux内核源码?详细讲解磁盘及文件系统管理(图例解析)全面详细介绍Linux虚拟文件系统(VFS)原理Perfetto是AndroidQ中引入的全新下一代平台级跟踪工具,为Android、Linux和Chrome平台提供了一种通用的性能检测和跟踪分析工具集。其核心是引入了一种全新的用户...

android怎样调用@hide和internal API

发布时间:2014-04-26 INTERNAL类 移动热点 ANDROID HIDE方法
Android有两种类型的API是不能经由SDK访问的。第一种是位于com.android.internal包中的API。我将称之为internalAPI。第二种API类型是一系列被标记为@hide属性的类和方法。从严格意义上来讲,这不是一个单一的API,而是一组小的被隐藏的API,但我仍将其假设为一种API,并称之为hiddenAPI。HiddenAPI 例子你可以查看一下android的源码,...

(Android)一种替换大量selector和shape文件的方法

发布时间:2022-11-10 开发语言 ANDROID KOTLIN
​声明:本文章已独家授权郭霖公众号在开发UI的时候,常常会有下面这种需求。一列以组为单位的选项,每一组的背景被一个带圆角的矩形包裹,组内不同位置的item按下时,阴影的圆角也不同。如上图,Top位置需要上面是圆角,Bottom位置需要下面是圆角,Middle位置都不是圆角,Single四个角都是圆角。要实现这样的效果并不困难,设计4套Selector,分别作为background给四个位置的Ite...

2021年最新Android面试精讲,含泪整理面经

发布时间:2021-05-17 移动开发 ANDROID 程序员 面试
前言今年上半年其实就已经有了换工作的想法,奈何疫情原因和岗位缩减,加之信心不足,到六月底投递了百度的Android岗位,本以为像我这种非211、985没工作经验的渣渣只能被直接pass,结果却意外的收到了电话,真是受宠若惊.经过电面,技术三面,然后就是等通知到最后拿到了OFFER,如梦一般,当时还是挺激动的。一.想要分享的内容开篇我也表达了我对“面经”的看法,所以我就不罗列具体的题目了,而且每次面...

Android studio 网格布局如何制作界面?

(一)网格布局概述1、布局特点GridLayout布局使用虚细线将布局划分为行、列和单元格,也支持一个控件在行、列上都有交错排列。可以自己设置布局中组件的排列方式可以自定义网格布局有多少行、多少列可以直接设置组件位于某行某列可以设置组件横跨几行或者几列2、继承关系图GridLayout类是ViewGroup子类3、常用属性(1)针对布局的属性属性含义rowCount行数columnCount列数l...

Android Layout研究 <四> 实例

发布时间:2014-09-28 ANDROID LAYOUT
以下实例是想做一个界面:这个界面全屏显示,有背景图片,可以显示Wifi和有线网络是否连通.可以显示当前日期,时间.并有横竖两排ICON.每个Icon代表一个App,点击则进入。咱们一步一步向下走:1.加背景图片,并使之全屏:layout/main.xml如下:&lt;?xmlversion="1.0"encoding="utf-8"?&gt;&lt;RelativeLayoutxmlns:andr...

android4.3

发布时间:2022-11-13 ANDROID
1、创建安卓应用基于EmptyActivity模板创建-GridLayoutCalculator2、字符串资源文件strings.xml&lt;resources&gt;&lt;stringname="app_name"&gt;网络布局:计算器界面&lt;/string&gt;&lt;/resources&gt;3、定义边框配置文件在drawable目录中添加custom_border.xml&l...

Android开发之旅:环境搭建及HelloWorld---吴秦(Tyler)

——工欲善其事必先利其器引言本系列适合0基础的人员,因为我就是从0开始的,此系列记录我步入Android开发的一些经验分享,望与君共勉!作为Android队伍中的一个新人的我,如果有什么不对的地方,还望不吝赐教。在开始Android开发之旅启动之前,首先要搭建环境,然后创建一个简单的HelloWorld。本文的主题如下:1、环境搭建1.1、JDK安装1.2、Eclipse安装1.3、Android...

Handler机制与生产者消费者模式

发布时间:2022-09-23 ANDROID 性能优化 UI ANDROID STUDIO JAVA
一、HandlerHandler在Android中通常用来更新UI。子线程执行任务,任务执行完毕后发送消息:Handler.sendMessage(),然后在UI线程Handler.handleMessage()就会调用,执行相应处理。Handler机制有几个非常重要的类:Handler:用来发送消息,sendMessage有多个重载方法,并实现handleMessage()方法处理回调(还可以使...

Android使用ZXing类库进行条码/二维码识别

发布时间:2011-12-26 ANDROID
Android使用ZXing类库进行条码/二维码识别(转)越来越多的手机具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描的功能.......手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片(二维码)等。     本文使用ZXing1.6实现条码/二维码识别。ZXing是个很经典的条码/二维码识别的开源类库,longlongago,就有开发者在J2ME上使用ZXing了,不过要支...

drawable对比

发布时间:2011-07-16 ANDROID 平台
新版Android新建工程后res文件夹下有三个文件夹,分别用于存放高中低分辨率的图片,系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片,在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。 三个文件夹对应屏幕分辨率分别为: drawable-hdpi   高分辨率的图片,如WVGA(480x800),FWVGA(480x854) drawable-mdpi...

Flask之路由(app.route)详解

发布时间:2022-07-31 ANDROID 前端 阿里巴巴 面试 后端
目录创建路由的两种方式方式一方式二?反向生成URL?注意事项!!!原因:解决:总结:自定义路由转换器重定向在讲创建路由之前先了解大致流程,工作本质在route源码中defroute(self,rule:str,**options:t.Any)-&gt;t.Callable:"""DecorateaviewfunctiontoregisteritwiththegivenURLruleandoptio...

android自定义布局中的平滑移动讲解

发布时间:2013-07-30 自定义 ANDROID
在android应用程序的开发过程中,相信我们很多人都想把应用的交互做的比较绚丽,比如让界面切换平滑的滚动,还有热度灰常高的伪3D等界面效果,通常情况下,系统提供的应用在特效这方面只能为我们提供简单的动画接口,所以要想实现比较酷炫的效果还是要自己去开发布局控件(即所谓的自定义View、ViewGroup)。小弟也经常做一些自定义的控件,最近工作比较清闲,所以便将自己对自定义布局控件的一些心得写出来...

Android.mk 之 编译生成

发布时间:2020-12-01 ANDROID
一、如何使用Android.mk编译生成apk?LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)//all-subdir-java-files把底层所有java文件取到LOCAL_SRC_FILES:=$(callall-subdir-java-files)//使用这个做编译可以生成一个LocalPackage.apkLOCAL_PACKAGE_NAME:...

【Python+Appium】开展自动化测试(二)appium连接真机启动app

     目录前言一,连接手机(测试机)二,获取测试手机及被测app的相应信息(即capability配置内容)三,appium启动app结语前言app自动化测试的第一步,是启动被测app。appium环境搭建好后,我们就可以连接真机启动app了。环境为windows,Appium1.18.0,Android手机,被测app为今日头条app,让我们开始吧。一,连接手机(测试机)通过USB线连接An...

docker搭建fastdfs环境

fastdfs是一个开源的分布式文件系统,在实际使用中,通过源码编译安装过程非常复杂,但是通过docker快速构建却非常容易。下面介绍通过docker安装fastdfs的方法。docker镜像的选择也挺重要的,我最开始选择season/fastdfs,发现有些麻烦,有的版本好像带nginx比如1.2,有的版本又不带nginx比如latest。我使用season/fastdfs镜像安装没有成功过,但...

Android_1

发布时间:2009-08-12 ANDROID LINUX PERMISSIONS APPLICATION JAVA RESOURCES
偶对Android比较有兴趣,不过这方面的资料比较少。所以我直接看google提供的资料。一方面一个人看难以理解,一方面也学着写读书笔记。主要是方便向大家请教。我是从头开始的,一开始是讨论框架的。下面是原文。AndroidapplicationsarewrittenintheJavaprogramminglanguage.ThecompiledJavacode—alongwithanydataan...

临近2022年末: Android 开发者的出路在哪?转行还是进阶?

你可能知道Android的近况,大体上现在移动开发已经不像以前那么活跃了,完全没有了几年安卓开发的那种火热势头。与此同时,有很多发言说Android的开发冷却了,不行了,没有前途了那么到底该如何看待这一现象呢?我的回答是Android还行,只是初级开发没有之前那么吃香了,初级市场进行了饱和,但是中高级岗位人才还是比较稀缺。移动互联网的发展不知不觉已经十多年了,MobileFirst也已经变成了AI...

Android -- bugNote》:Seletor 失效原因

发布时间:2022-11-18 ANDROID
conclusion:(一)item顺序selector中各个item的顺序是会影响实际效果的,selector的item从上到下是按照匹配原则来改变状态的,一旦匹配到某个item的状态,就不会继续往下匹配&lt;?xmlversion="1.0"encoding="utf-8"?&gt;&lt;selectorxmlns:android="http://schemas.android.com/a...