zoukankan      html  css  js  c++  java
  • android listview高级用法

    这是我listview用的最高级的地方了,所谓的高级在你们眼里也许是低级。这里主要实现了可以对listview进行监听。

    ListView是一种用于垂直显示的列表控件,如果显示内容过多,则会出现垂直滚动条。它能够通过适配器将数据和自身绑定,在有限的屏幕上提供大量内容供用户选择,所以是经常使用的用户界面控件。
    ListView编程的一般步骤
    1)在布局文件中声明ListView控件
    2) 使用一维或多维动态数组保存ListView要显示的数据 ;
    3) 构建适配器Adapter,将数据与显示数据的布局页面绑定;
    4)通过setAdapter()方法把适配器设置给ListView

    第一步,先对main.xml进行布局。看了布局代码,大家就应该会明白了

     

    View Code
     1 <?xml version="1.0" encoding="utf-8"?>
    2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3 android:orientation="horizontal" android:layout_width="fill_parent"
    4 android:layout_height="wrap_content" android:gravity="center_vertical">
    5
    6 <ImageView android:id="@+id/ivLogo"
    7 android:layout_width="60dp"
    8 android:layout_height="60dp"
    9 android:src="@drawable/icon"
    10 android:paddingLeft="5dp" />
    11 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    12 android:orientation="vertical" android:layout_width="wrap_content"
    13 android:layout_height="wrap_content" android:gravity="right"
    14 android:padding="10dp">
    15
    16 <TextView android:id="@+id/tvApplicationName"
    17 android:layout_width="wrap_content"
    18 android:layout_height="wrap_content"
    19 android:textSize="16dp" />
    20 <TextView android:id="@+id/tvAuthor"
    21 android:layout_width="wrap_content"
    22 android:layout_height="wrap_content"
    23 android:layout_below="@id/tvApplicationName"
    24 android:textSize="14dp" />
    25 </RelativeLayout>
    26 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    27 android:orientation="vertical" android:layout_width="fill_parent"
    28 android:layout_height="wrap_content" android:gravity="right"
    29 android:padding="10dp">
    30 <TextView android:id="@+id/tvRating"
    31 android:layout_width="wrap_content"
    32 android:layout_height="wrap_content"
    33 android:text="5.0" />
    34 <RatingBar android:id="@+id/ratingbar"
    35 android:layout_width="wrap_content"
    36 android:layout_height="wrap_content"
    37 android:numStars="5"
    38 style="?android:attr/ratingBarStyleSmall"
    39 android:layout_below="@id/tvRating" />
    40 </RelativeLayout>
    41 </LinearLayout>


    第二步:在layout文件夹下新建一个rating.xm文件,这样做的目的是方便调用

    View Code
     1 <?xml version="1.0" encoding="utf-8"?>
    2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3 android:orientation="horizontal"
    4 android:layout_width="fill_parent"
    5 android:layout_height="wrap_content"
    6 android:gravity="center_vertical">
    7 <RatingBar android:id="@+id/ratingbar"
    8 android:layout_width="wrap_content"
    9 android:layout_height="wrap_content"
    10 android:numStars="5"/>
    11 </LinearLayout>

     

    第三步:编写LayoutTest04Activity,注释都在代码里

     

    View Code
      1 package cn.edu.zwu.tel;
    2
    3 import java.util.ArrayList;
    4 import java.util.List;
    5
    6 import android.app.AlertDialog;
    7 import android.app.ListActivity;
    8 import android.content.Context;
    9 import android.content.DialogInterface;
    10 import android.content.DialogInterface.OnClickListener;
    11 import android.os.Bundle;
    12 import android.view.LayoutInflater;
    13 import android.view.View;
    14 import android.view.ViewGroup;
    15 import android.widget.BaseAdapter;
    16 import android.widget.ImageView;
    17 import android.widget.LinearLayout;
    18 import android.widget.ListView;
    19 import android.widget.RatingBar;
    20 import android.widget.TextView;
    21
    22 public class LayoutTest04Activity extends ListActivity {
    23 //定义四个数组,分别做显示用
    24 private static String[] applicationNames = new String[]
    25 { "this is just a button","made by forrest",
    26 "you can do it","come on","you will success" };
    27 private static String[] authors = new String[]
    28 { "邵洋江","邵洋江","邵洋江","邵洋江","邵洋江" };
    29 private static int[] resIds = new int[]
    30 { R.drawable.bg11,R.drawable.bg21,R.drawable.bg29,
    31 R.drawable.bg42,R.drawable.bg45,R.drawable.bg46 };
    32 private static float[] applicationRating = new float[]
    33 { (float) 5.0, (float) 5.0, (float) 3.5, (float) 5.0, (float) 4.0 };
    34
    35 String inflater = Context.LAYOUT_INFLATER_SERVICE;
    36 LayoutInflater layoutInflater;
    37 private RatingAdapter raAdapter;
    38 //自定义一个Adapter继承BaseAdapter,要重写getCount(),getItem(),getItemId(),getView()四种方法
    39 private class RatingAdapter extends BaseAdapter
    40 {
    41 private Context context;
    42 //构造函数
    43 public RatingAdapter(Context context)
    44 {
    45 this.context = context;
    46 layoutInflater = (LayoutInflater) context
    47 .getSystemService(inflater);
    48 }
    49
    50 //@Override
    51 public int getCount()
    52 {
    53 return applicationNames.length;
    54 }
    55
    56 // @Override
    57 public Object getItem(int position)
    58 {
    59 return applicationNames[position];
    60 }
    61
    62 // @Override
    63 public long getItemId(int position)
    64 {
    65 return position;
    66 }
    67 //设置星行分数
    68 public void setRating(int position, float rating)
    69 {
    70 applicationRating[position] = rating;
    71 //在adapter的数据发生变化以后通知UI主线程根据新的数据重新画图
    72 notifyDataSetChanged();
    73 }
    74
    75 // @Override
    76 public View getView(int position, View convertView, ViewGroup parent)
    77 {
    78 //对listview布局
    79 LinearLayout linearLayout = (LinearLayout) layoutInflater.inflate(
    80 R.layout.main, null);
    81 //分别得到五个组件
    82 ImageView ivLogo = (ImageView) linearLayout
    83 .findViewById(R.id.ivLogo);
    84 TextView tvApplicationName = ((TextView) linearLayout
    85 .findViewById(R.id.tvApplicationName));
    86 TextView tvAuthor = (TextView) linearLayout
    87 .findViewById(R.id.tvAuthor);
    88 TextView tvRating = (TextView) linearLayout
    89 .findViewById(R.id.tvRating);
    90 RatingBar ratingBar = (RatingBar) linearLayout
    91 .findViewById(R.id.ratingbar);
    92 //五个组件分别得到内容
    93 ivLogo.setImageResource(resIds[position]);
    94 tvApplicationName.setText(applicationNames[position]);
    95 tvAuthor.setText(authors[position]);
    96 tvRating.setText(String.valueOf(applicationRating[position]));
    97 ratingBar.setRating(applicationRating[position]);
    98 return linearLayout;
    99 }
    100 }
    101
    102 @Override
    103 protected void onListItemClick(ListView l, View view, final int position,long id)
    104 {
    105 View myView = getLayoutInflater().inflate(R.layout.rating, null);
    106 final RatingBar ratingBar = (RatingBar) myView.findViewById(R.id.ratingbar);
    107 ratingBar.setRating(applicationRating[position]);
    108 new AlertDialog.Builder(this).setTitle(applicationNames[position])
    109 .setMessage("给应用程序打分").setIcon(resIds[position])
    110 .setView(myView).setPositiveButton("确定", new OnClickListener()
    111 {
    112
    113 // @Override
    114 public void onClick(DialogInterface dialog, int which)
    115 {
    116 raAdapter.setRating(position, ratingBar.getRating());
    117 }
    118 }).setNegativeButton("取消", null).show();
    119 }
    120
    121 //@Override首先先new出listview,再对每个listview进行布局,再产生一个自定义适配器,
    122 //再把这个适配器映射到listview中
    123 public void onCreate(Bundle savedInstanceState)
    124 {
    125 super.onCreate(savedInstanceState);
    126 List<View> viewList = new ArrayList<View>();
    127 viewList.add(getLayoutInflater().inflate(R.layout.main, null));
    128 raAdapter = new RatingAdapter(this);
    129 setListAdapter(raAdapter);
    130 }
    131 }


    下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,
    根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),
    然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,
    列表将不显示同样return 1,就只显示一行。

    系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,
    必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。
    getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。
    我们用LayoutInflater的方法将定义好的rating.xml文件提取成View实例用来显示。
    然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。
    但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。
    至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,
    他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。
    在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。
    好了,绘制完这一行了。那再绘制下一行,直到绘完为止。

    效果图:

     

       




     

  • 相关阅读:
    qemu-img压缩磁盘操作
    qemu-img压缩磁盘操作
    qemu-img压缩磁盘操作
    qemu-img压缩磁盘操作
    单文件组件
    单文件组件
    单文件组件
    单文件组件
    最适合人工智能开发的5种编程语言优缺点对比
    浅谈WebService开发(一)
  • 原文地址:https://www.cnblogs.com/shaoyangjiang/p/2368397.html
Copyright © 2011-2022 走看看