安卓,ListView,打气筒的初次使用

Posted 孤舟一夏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓,ListView,打气筒的初次使用相关的知识,希望对你有一定的参考价值。

先来介绍一下ListView这么个东西,适合用在一排数据的展示中,

例如,这样的一个就是使用了List View这么一个控件实现功能

 

实现的思路主要是这样

在布局里面加一个ListView像是这样,以下代码是常用的他的一些方法

    <ListView
        android:id="@+id/lv"  //加一个id号
        android:layout_width="match_parent"    //设置宽度高度
        android:fastScrollEnabled="true"      //实现一个下滑块,方便一下到底
        android:layout_height="match_parent"></ListView>

然后在MainActivity中找到这个控件,然后为他增加一个适配器。

适配器我们最先介绍一个叫做BaseAdapter的适配器,这个比较洋气

比较好用,

 实现的效果是上面的那一个图

 

package com.example.xialm.list_test2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView ll = (ListView)findViewById(R.id.lv);
//设置适配器
        ll.setAdapter(new myad());
    }

//开始编写适配器
    public class myad extends BaseAdapter{

//下面是Base Adapter的四个构造方法, @Override
public int getCount() { //实现几个条目的显示 return 100000; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView tv; if(convertView == null){ //创建新的缓存对象 tv = new TextView(MainActivity.this); }else{ //复用新的缓存对象 tv = (TextView)convertView; } int s = position+1; tv.setText("你好,你是第"+s+"个世界"); return tv; } } }

既可实现,

 

那么我们可以看到上面那个有点low,像我们手机上那种洋气一点的布局是怎么做的呢,

最起码得实现一个这样的布局把

如下:

 

 这个好像还可以接受一小下下,那么我们现在的数据是我们自己造的,我们在后面会提到

如何从其他的地方拿到我们需要的东西然后再放到我们的LIst View上面来显示,

尤其是数据库中的数据放到我们的界面上

先不剧透了,先来搞上面的那个界面,

有第一个案例来说, 我们可以发现要做出这样的案例,只需要改动我们Adapter里面的一个

叫做getView 这个方法就可以了,

也就是我们要改动的是这一块

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView tv;

            if(convertView == null){
                //创建新的缓存对象
                tv  = new TextView(MainActivity.this);
            }else{
                //复用新的缓存对象
                tv = (TextView)convertView;
            }
            int s = position+1;
            tv.setText("你好,你是第"+s+"个世界");

            return tv;
        }

整体的框架我们不需要改动,尤其是if  和  else这一段逻辑

解释一下这一段逻辑是用来实现将我们的程序内存最大的优化

是我们的app的运行更加流畅,使资源不会因为还没有释放之前,

就内存溢出了

那么我们改动哪一块呢,

应该是textview那一快

看上去这样只能显示一行的内容,我们现在想要在左边显示一个图片,

在右边显示两个文本框框,这个明显涉及到了布局

我们再回首看我们的代码的时候发现,我们代码中写的我们只能显示view

当然TextView是View的一种啦

那么顺理成章的,现在可以将目光和思路引导到我们实现 将布局文件转换为 view的伟大道路上

Android底层的工程师为我们创建了这么一个api正好是可以进行实现我们的功能

江湖人称,打气筒,

总结一下,一切思路和上面第一个案例一样,

我们只需要改变Adapter中第四个构造方法中的view

想实现那个就必须要将layout文件转换为view,我们引进了一个技术叫做打气筒

下面是代码

xml

main

只有一个listview控件

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.xialm.listview_3.MainActivity">


    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:fastScrollEnabled="true"

        android:layout_height="match_parent"></ListView>

</RelativeLayout>

xml

item

 这个是我们每一个显示条目的格式,

 

 

大概就是这样,左边是一个图片,右边是两个文本框,上面一个大一点的下面是一个小一点的

在代码中需要实现一个打气筒的步骤这一步是将一个layout布局变成一个view,

这样来实现,能够把一个布局变成一个view,显示到listview中

下面是逻辑代码

package com.example.xialm.listview_3;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;
import java.util.zip.Inflater;

public class MainActivity extends AppCompatActivity {

    AlertDialog builder=null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //找到List View这个我们关心的对象
        ListView lv_ =(ListView)findViewById(R.id.lv);
        //给我们的lv_一个适配器,用于给我们的lv_加上数据
        lv_.setAdapter(new Myad());
        //做完这一步之后就是建类,是一个我们的适配器类,这里是继承了BaseAdapter
    }

    
    //当用户选择点击返回的时候,给用户以友好的提示
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            builder = new AlertDialog.Builder(MainActivity.this)
                    .setTitle("温馨提示:")
                    .setMessage("您是否要退出程序?")
                    .setPositiveButton("确定",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                                    int whichButton) {
                                    MainActivity.this.finish();
                                }
                            })
                    .setNegativeButton("取消",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                                    int whichButton) {
                                    builder.dismiss();
                                }
                            }).show();
        }
        return true;

    }

    
    //自己定义一个类继承baseadapter
    public class Myad extends BaseAdapter
    {
        @Override
        public int getCount() {
            //创建多少个项目
            return 500;
        }

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

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View view;
            if(convertView == null){
            //创建新的view对象
                //可以通过一个打气筒将一个布局资源转换为一个view对象
                //view = View.inflate(MainActivity.this,R.layout.itemm,null);
                //将布局文件不仅转换成了view,而且最后一个参数用来做了一个组,
                // 可以把刚生成的view添加进来

                //打气筒的第二种方法
                view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.itemm,null);

                //打气筒的第三种方法
                //LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
                //view = inflater.inflate(R.layout.itemm,null);

            }else {
            //复用旧的view对象
            view = convertView;

            }

            return view;
        }
    }

}

 

 

 

下面介绍一个比较简单的数组适配器,arrayadapter

 

 相比于上面的那一个我们可以看出来,好像使用第一个baseadapter也可以实现同样的功能,

是的,因为数组适配器的出现就是为了显示数组中的基本内容,并且是显示到一个文本框框里面,

我们知道数据适配器的作用就是用来实现,把数据和显示连接在一起,像是数据-->适配器-->显示器,这样一个过程

那么,需求如果是很简单的内容,我们是不是还需要使用复杂的适配器呢,

当然不用,这里提供一个适配器叫做数组适配器,使用方法简单

使用的场合是仅显示一行文字的时候使用

下面是代码‘

xml:mainactivity

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.xialm.arrayadapter.MainActivity">


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

        ></ListView>
</RelativeLayout>

 

xml:item

<?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="horizontal"
    >

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textColor="#000"
        />
    <TextView
        android:id="@+id/tv_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textColor="#999"
        />

</LinearLayout>

 

逻辑代码

package com.example.xialm.arrayadapter;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到关心的控件
        ListView ll = (ListView)findViewById(R.id.lv_1);

        //定一个数组为了加进去
        String objects[] = {"你好","世界","hello","world"};

        //搞一个数组适配器,将数组里面的内容展示到我们的listview上
        //但是我们的这个适配器有一个局限性,智能显示一个textview,要实现更多的功能还是需要使用复杂一点的适配器,
        ArrayAdapter<String> myadd = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_name,objects);
        //ArrayAdapter<String> myadd1 = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_number,objects);
        //设置数据适配器
        ll.setAdapter(myadd);
        //ll.setAdapter(myadd1);

    }
}

 

下面一种是simpleadapter

集合里面放字典

字典里面放键值对

使用设置好的集合配置  simpleadapter

 

 

xml main

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.example.xialm.simpleadapter.MainActivity">

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/tv_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="姓名"
            />

        <TextView
            android:id="@+id/tv_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="电话"
            />

    </LinearLayout>

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/lv_1"
        android:layout_below="@+id/ll"
        >


    </ListView>

</RelativeLayout>

xml item

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

        <TextView
            android:id="@+id/tv_3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="姓名"
            />

        <TextView
            android:id="@+id/tv_4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="电话"
            />

    </LinearLayout>
</LinearLayout>

逻辑代码

package com.example.xialm.simpleadapter;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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 {

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

        //找到我们关心的控件
        ListView lv = (ListView) findViewById(R.id.lv_1);

        //准备listview要显示的数据
        List<Map<String,String>> data1 = new ArrayList<Map<String, String>>();

        //准备map放入list,
        Map<String,String> map1 = new HashMap<String,String>();
        map1.put("name","猪哥");
        map1.put("phone", "663924");

        Map<String,String> map2 = new HashMap<String,String>();
        map2.put("name","梅鸣");
        map2.put("phone", "662086");

        Map<String,String> map3 = new HashMap<String,String>();
        map3.put("name","你岩");
        map3.put("phone","662110");

        data1.add(map1);
        data1.add(map2);
        data1.add(map3);

        SimpleAdapter mysim = new SimpleAdapter(MainActivity.this,data1,R.layout.item,new String[]{"name","phone"},new int[]{R.id.tv_3,R.id.tv_4});
        //上下文,要显示在哪个界面上的
        //数据,这个数据是一个list,里面有map的一个数据,
        //加载的界面
        //这个是显示的列,
        //列里面显示什么,因为id号是int所以使用int数组


        //配置这个适配器
        lv.setAdapter(mysim);



    }
}

 

以上是关于安卓,ListView,打气筒的初次使用的主要内容,如果未能解决你的问题,请参考以下文章

安卓源代码----安卓系统启动过程(初次研究源代码,表述不当还请见谅)

ListView 未显示在片段中

片段中 ListView 的 setOnItemClickListener

在内部片段类中使用ListView

片段中ListView的setOnItemClickListener

按下后退按钮时正在重新创建 Listview 片段