欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ListView

程序员文章站 2022-05-25 19:58:56
...

添加新页面的步骤

  1. 在java包下对应子包中创建activity类
  2. 在layout包下创建对应的xml布局文件
  3. 在activity类中重写onCreate方法,并指定布局文件
  4. 在app/src/main/AndroidManifest.xml中添加声明
    完整写法:<activity android:name=“com.example.test.listview.ListViewActivity”>
    包名可以省略点保留,可以写作<activity android:name=".listview.ListViewActivity">

Context

  • Context是什么?
  1. Context是一个抽象类,其通用实现在ContextImpl类中。

  2. Context:是一个访问application环境全局信息的接口,通过它可以访问application的资源和相关的类,其主要功能如下:

    启动Activity
    启动和停止Service
    发送广播消息(Intent)
    注册广播消息(Intent)接收者
    可以访问APK中各种资源(如Resources和AssetManager等)
    可以访问Package的相关信息
    APK的各种权限管理

    从以上分析可以看出,Context就是一个对APK包无所不知的大管家,大家需要什么,直接问它就可以了。

  • Context与View的关系
    View与Context(或Activity)的关系类似于明星与经纪人的关系,所以创建View时,必须明确指定其Context(即经纪人或大管家),否则View就成不了明星。

  • 何时创建Context
    应用程序在以下几种情况下创建Context实例:

    1. 创建Application 对象时, 而且整个App共一个Application对象

    2. 创建Service对象时

    3. 创建Activity对象时
      这三个类就是Context的三大实现类。
      因此应用程序App共有的Context数目公式为:

    总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)

适配器

要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView,后面还会学习其他的)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。
一般只要用BaseAdapter就行

ListView

  • ListView是一个列表控件。一个ListView通常有两个职责。

    (1)将数据填充到布局。

    (2)处理用户的选择点击等操作。

  • 一个ListView的创建需要3个元素。

    (1)ListView中的每一列的View。

    (2)填入View的数据或者图片等。

    (3)连接数据与ListView的适配器。

创建一个列表控件的步骤

  1. 在layout下创建xml布局文件
  • 常用属性:
  • listSelecter:设置布局样式,类似background
  • divider:设置子项分割线的颜色
  • dividerHeight:设置分割线的宽度
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/lv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:listSelector="@drawable/listview"
        android:divider="#0f0"
        android:dividerHeight="2dp">

    </ListView>
</LinearLayout>
  1. 创建适配器类MyListAdapter
package com.example.test.listview;

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.bumptech.glide.Glide;
import com.example.test.R;


public class MyListAdapter extends BaseAdapter {
    private Context context;
    private LayoutInflater layoutInflater;
    public MyListAdapter(Context context){
        //Activity是Context的子类,在哪个activity里调这个方法,传进来的就是谁
        this.context = context;
        //根据这个Context(activity)创建layoutInflater对象,用来获取布局文件对象
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    //列表长度
    public int getCount() {
        return 10;
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }
    //这个内部类是用来保存视图中控件的引用,以免每次都要重新find,浪费性能
    static class ViewHolder{
        public ImageView imageView;
        public TextView tvTitle,tvTime,tvContent;
    }
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder = null;
        if (view == null) {
         //获取布局文件
            view = layoutInflater.inflate(R.layout.layout_listview,null);
            viewHolder = new ViewHolder();
            viewHolder.imageView = view.findViewById(R.id.iv);
            viewHolder.tvTitle = view.findViewById(R.id.tv_title);
            viewHolder.tvTime = view.findViewById(R.id.tv_time);
            viewHolder.tvContent = view.findViewById(R.id.tv_context);
            view.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.tvContent.setText("这是setText的文本");
        viewHolder.tvTime.setText("这是setText的文本");
        viewHolder.tvTitle.setText("这是setText的文本");
        Glide.with(context).load("").into(viewHolder.imageView);
        return view;
    }
}

layoutInflater.inflate的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById()的区别,inflate是加载一个布局文件,而findViewById则是从布局文件中查找一个控件。

  1. 创建ListViewActivity类,并为每个列表项添加点击和长按效果
package com.example.test.listview;

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

import com.example.test.R;

public class ListViewActivity extends Activity {
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview);
        listView = findViewById(R.id.lv1);
        //this表示当前对象,ListViewActivity.this这种写法一般用在内部类里,因为在外部类中直接可以用关键字this表示本类的对象,而内部类中直接写this的话表示的是内部类本身,想表示外部类的话就得加上外部类的类名.this。
        listView.setAdapter(new MyListAdapter(ListViewActivity.this));
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(ListViewActivity.this,"点击:"+i+"LONG:"+l,Toast.LENGTH_SHORT).show();
            }
        });
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(ListViewActivity.this,"长按:"+i+" long:"+l,Toast.LENGTH_SHORT).show();
                //return false表示后续监听器继续执行,这样触发了长按后点击事件还会触发,设为true后续就不会触发
                return true;
            }
        });
    }
}



相关标签: ListView