移动设备软件开发-6

1.ListView

1.1ListView简介

1.简介:就是一个列表控件。方便展示数据,并可以独立的为各行的元素设置监听器。每一行可以是一个独立的元素也可以是一个字符串,也可以是一个组合控件。

真正的数据在Adapter中,View只负责数据的更新和显示。

2.常见的属性?

  • entiires设置的是数组资源,用xml表示

  • divider,设置list列表项的分割条

  • dividerHight,设置分割条的宽度

1.2ListView的创建

1.创建的方式有两种?

第一种:使用values下的资源

  • 直接ListView创建

  • 直接使用资源文件给出列表项

  • 使用适配器给出列表项

第二种:继承ListActivity

2.案例:

第一种:创建方式创建ListView

第一步:values下创建数组。books。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="books">
        <item>Java面向对象</item>
        <item>数据结构</item>
        <item>操作系统</item>
        <item>Javaweb</item>
    </string-array>
</resources>

第二步:创建布局文件

<!--设置布局-->
    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:entries="@array/books"
        />

效果图:

第二种:使用activity创建。适配器去提供数据。

数据->适配器->数据

适配器是数据和视图之间的桥梁

第一步:创建布局文件

<ListView
    android:id="@+id/listview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
​
    />

第二步:创建适配器

public ArrayAdapter (Context context, int resource, T[] objects)
  • 参数1:上下文

  • 参数2:每一行列表项TextView的样式。安卓中提供了一些布局样式,或者自定义一个TextView的布局样式。

    • simple_list_item_1:每个列表项都是一个普通的textView

    • simple_list_item_2:每个列表项都是一个普通的

    • textView(字体略大)

    • simple_list_item_checked:每个列表项都是一个已勾选的列表项

    • simple_list_item_multiple_choice:每个列表项都是带多选框的文本

    • simple_list_item_single_choice:每个列表项都是带单选框的文本

  • 参数3:数据源(数组或者是集合)

//        获取ListView对象
        ListView listView=findViewById(R.id.listview1);
        String citys[]={"北京","上海","天津","济南","日照"};
        ArrayAdapter adapter=new ArrayAdapter(this, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,citys);
        listView.setAdapter(adapter);

第三种:

如果说程序的窗口只需要显示一个列表的话,可以直接让Activity继承ListActivity就行不用去写setContentView方法。说明这个布局是一个简单的布局文件。

一个ListActivity必须包含一个ListView。可以通过this.getListView去获取ListBiew对象。

第一步:创建一个activity实现ListActivity接口

实现ListActivity类的布局是一个系统默认存在的不需要用户去设置的一个布局,默认显示的就是列表控件布局。

案例:显示几个大学的名称。

//用ListView接口实现的ListView
public class ListactivityActivity extends ListActivity   {
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_listactivity);
        String str[]={"北京大学","山东大学","清华大学","南京大学","天津大学"};
        ArrayAdapter adapter=new ArrayAdapter(this, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,str);
        this.setListAdapter(adapter);
        
    }
}

效果图:

第四种:继承ListActivity的同时可以指定自定义的列表项的布局

第一步:layout下创建一个新的布局文件array_item

  • 设置了一个id

  • 宽度和高度

  • 字体的大小

  • 内容和控件之间的距离

  • 阴影的颜色

  • 阴影的伸展范围

  • 控件内部元素居中显示

  • 文字的颜色

  • typeface设置的是文字的字体

注意:此时定义的只是列表空间的显示效果与具体的数据是没有关系的

原先设置的样式都系统中自带的,现在设置的都是自定义的样式

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="30dp"
    android:padding="10dp"
    android:shadowColor="#f0f"
    android:shadowDx="4"
    android:shadowDy="4"
    android:shadowRadius="2"
    android:typeface="serif"
    android:gravity="center"
    android:textColor="#000000"
/>

第二步:创建activity。我直接用的上面的案例那个。

        String str[]={"北京大学","山东大学","清华大学","南京大学","天津大学"};
//        此时第二个参数引用的就是我们当前布局文件的样式(只是引用了样式,并没有设置其他的内容)
        ArrayAdapter adapter=new ArrayAdapter(this, R.layout.array_item,str);
        this.setListAdapter(adapter);

效果图:

第五种:继承ListActivity的同时,使用自定义的xml布局文件。需要在布局文件中创建一个id是

第一步:在activity对应的布局文件中创建一个ListView的控件。

出现错误的话推荐阅读博客:使用android时出现"无法解析符号"错误:id ="@ + android:id/my_id" |

@+id/是创建自己的id

@id/是使用自已已经创建的id

@android:id/使用的是系统创建的id

<LinearLayout 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:orientation="vertical"
    >
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:divider="@color/black"
        android:dividerHeight="5dp"
        />
​
​
​
</LinearLayout>
​

第二步:编写activity控件。需要继承ListActivity。

这里面需要设置setContentView(R.layout.activity_listactivity);

        setContentView(R.layout.activity_listactivity);
        String str[]={"北京大学","山东大学","清华大学","南京大学","天津大学"};
//        此时第二个参数引用的就是我们当前布局文件的样式(只是引用了样式,并没有设置其他的内容)
        ArrayAdapter adapter=new ArrayAdapter(this, R.layout.array_item,str);
        this.setListAdapter(adapter);

效果图:

3.总结

虽然,实现ListActivity的方式很方便,但是对于复杂的列表项的实现不行的。需要用SimpleAdapter去实现。

1.3使用SimpleAdapter创建ListView

1.优点:可以显示复杂的列表项。例如,图片。

2.构造函数:

public SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {...}
​
  • 第一个参数:就是当前的activity,传入this就可以。

  • 第二个参数:List集合对象,但是集合中的元素都是Map集合的形式。每一个Map就是一个列表项。

  • 第三个参数:指定一个布局文件的id。也就是当前的列表项用的是哪个布局文件。

  • 第四个参数:Map集合中的主键集合。表示的是当前的ListView有几列(里面需要填入的是列的名字)。

  • 第五个参数:就是第三个参数中的布局文件中需要显示的控件的id。注意,需要和第四个参数进行一一对应起来。

1.3.1使用SimpleAdapter创建ListView

1.每一行的列表项对应一个Map。一个ListView其实就是一个List。其实最终就是把每一个map放到ListView中去。

2.案例:使用SimpleAdapter创建ListView

效果图:

第一步:创建主布局文件.activity_simpleadapter.xml

主布局文件里面放置的是一个ListView和一个TextView用于显示内容的

<?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="wrap_content"
    android:orientation="vertical"
    >
<!--  用于显示用户的信息  -->
    <ListView
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
​
​
    <!--    用于显示当前选中的是哪一列的用户-->
    <TextView
        android:id="@+id/txtResult"
        android:textSize="30dp"
        android:text="请选择:"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

第二步:创建子项目的布局文件.test.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">
​
    <ImageView
        android:maxHeight="20dp"
        android:maxWidth="20dp"
        android:adjustViewBounds="true"
        android:id="@+id/header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
​
        />
    <TextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
​
        />
    <TextView
        android:id="@+id/desc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
​
        />
​
</LinearLayout>

第三步:找几张图片放到mopmap中去

找的图片是im1-img4,全是png的图片

第四步:编写activity文件,并设置监听.SimpleadapterActivityjava

//用SimpleAdapter实现列表项
public class SimpleadapterActivity extends AppCompatActivity {
//初始化对象
private String[] names={"张三","李四","王五","赵六"};
private String[] desc={"帅气","聪明","灵力","优秀"};
//头像的id
private int[] imageId={R.mipmap.im1,R.mipmap.im2,R.mipmap.im3,R.mipmap.im4};
//当前选中的结果
TextView txetResult=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simpleadapter);
//      获取布局文件中的对象
        txetResult=findViewById(R.id.txtResult);
//        创建一个List集合,集合中的元素是map
        List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
//        初始化集合中的元素
        for (int i = 0; i < names.length; i++) {
            Map<String,Object> listItem=new HashMap<String,Object>();
//            放入头像
            listItem.put("header",imageId[i]);
//            放入姓名
            listItem.put("username",names[i]);
//            放入个人的描述
            listItem.put("desc",desc[i]);
//            将map存到list集合中去
            list.add(listItem);
        }
​
//        创建一个SimpleAdapter
//        这里传入的是R.layout.test
//        第三个参数指定的是子项的布局文件
        SimpleAdapter simpleAdapter=new SimpleAdapter(this,list,R.layout.test,new String[]{"header","username","desc"},new int[] {R.id.header,R.id.username,R.id.desc});
//        创建ListView
        ListView listView=findViewById(R.id.mylist);
//        给listview设置SimpleAdapter
        listView.setAdapter(simpleAdapter);
//        给当前的listView设置监听事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
//            第
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view就是被点击的item对象
//                这里的要用view去获取子布局文件中的元素内的内容
                TextView username=(TextView)view.findViewById(R.id.username);
                TextView descs=(TextView)view.findViewById(R.id.desc);
//                Log.d(TAG, ((TextView) view.findViewById(R.id.username)).getText().toString());
//                Log.d(TAG, names[position]);
//                拼接要显示的内容
                txetResult.setText("当前选中的是:"+username.getText().toString()+"---个人简介是:"+descs.getText().toString());
                Toast.makeText(SimpleadapterActivity.this,"当前您点击的是 name:"+username.getText().toString()+"个人简介是:"+descs.getText().toString() , Toast.LENGTH_SHORT).show();
            }
        });
​
    }
}

推荐阅读:Android之旅第四站——Simpleapter的使用…_Li_peilun的博客-CSDN博客

1.3.2ListView的事件监听

1.setOnItemClickListener用于设置事件的监听,监听在点击改项目的子项目的时候触发。

需要实现public void onItemClick(AdapterView<?> parent, View view, int position, long id) {}方法。

  • 第一个参数,被点击的列表项属于哪一个ListView

  • 第二个参数:被点击的item对象

  • 第三个参数,int position,被点击的item对象的位置

  • 第四个参数,被点击的item对象的id

2.setItemLongClickListener,长事件的监听

3.OnTouchListener,监听器在触碰到ListView时触发

4.OnScrollListener,监听器在ListView滚动的时候触发

1.4BaseAdapter案例的实现

简单投票案例的实现:

效果图:

投票案例代码,下期更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不懂代码的孩子

谢谢大佬

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值