基于Java语言的安卓编程之ListView(下)

时间:2022-04-28 00:22:15

前一天学习了ListView控件中显示图像和文字的方法。通过设置ListView控件的适配器实现。该适配器为自定义适配器,在自定义适配器中,重写getView()方法,设置ListView每个子项的数据、布局以及布局中各控件显示的内容。

当ListView子项每次显示的时候,自定义适配器中的getView()方法都会被调用。而在getView()方法的每次调用都要涉及到布局XML文件的导入,这样使得程序运行起来效率非常低下,今天我们将解决这个问题。今天还要实现的是点击ListView控件的某个子项,则在屏幕下方显示该项对应的内容,如图1所示。

基于Java语言的安卓编程之ListView(下)

图1 显示相应内容

1getView()方法代码的改进

在“ListView控件(上)”中提到,getView()方法的格式是public View getView (intposition, View convertView, ViewGroup parent)

其中,第二个参数convertView表示可以重复使用的“旧”视图。因此,每当getView()方法被调用时,应当先判断该参数是否可用,即“旧”视图是否可以重复使用,如果可用,则将该参数作为视图,如果不可用,在从布局XML文件中创建视图。

在getView()方法中,将

Viewview =LayoutInflater.from(getContext()).inflate(resourceId,null);

注释掉之后,添加如下代码

    View view;

1   if(convertView ==null)

2   {

3   view =LayoutInflater.from(getContext()).inflate(resourceId,

4 null);

5   }else

6   {

7      view= convertView;

8   }

其中,第1行对“旧”视图进行判断,如果不可用,则在第3行中调用inflate()方法从XML文件中创建视图;如果“旧”视图可用,则在第7行中将view的值赋值为“旧”视图。这样就避免了每次显示ListView控件的子项时都要调用inflate()方法创建视图,提高了效率。

2 ListView子项点击监视器

通过点击监视器实现点击ListView控件的某个子项时,显示指定的内容。使用setOnItemClickListener()方法为ListView控件添加点击监视器。该方法的格式为

public void setOnItemClickListener (OnItemClickListener listener)

该函数的参数是OnItemClickListener接口的对象。在MainActivity类的onCreate()方法中,有如下代码

1      listView.setOnItemClickListener(new OnItemClickListener(){

2          @Override

3          publicvoid onItemClick(AdapterView<?> parent, View view, int 4  position,long id){

5             Continentcontinent =continentList.get(position);

6             Toast.makeText(MainActivity.this, continent.getName(),

7 Toast.LENGTH_SHORT).show();

8          }

9      });

其中,第1行为ListView控件添加了点击监视器,通过new关键字新建了OnItemClickListener接口的对象。在该接口对象中,需要重载onItemClick()方法。

2.1onItemClick()方法

当ListView控件的子项被点击后,onItemClick()方法将被调用。该方法的格式为

publicabstract void onItemClick (AdapterView<?>parent, View view,int position, long id)

其中,abstract表示该方法是抽象的;参数parent指定了点击发生的AdapterView,AdapterView类派生自android.view.ViewGroup,该类是一个视图,这个视图的子项由适配器来指定,因此在使用AdapterView时还需要指定适配器,该格式为

AdapterView<Textends android.widget.Adapter>

在onItemClick()方法的参数AdapterView<?>中的?即表示适配器的类型未知;该方法的view参数表示点击事件发生的视图,view是parent的子项;position表示view在parent中的位置;id指定了view的行ID。

在以上代码中,第3-4行定义了onItemClick()方法,第5行中的continentList是在InitContinent()方法中初始化的数据列表,通过get()方法和positon参数获取用户点击的ListView子项对应的自定义数据类Continent的对象,即continent。接下来就是要在屏幕下方显示该数据。

2.2Toast类的使用

可以通过Toast类实现在屏幕下方显示数据信息。Toast类的完整名称是android.widget.Toast,直接派生自java.lang.Object。用来通过消息框显示指定内容。

以上代码的第6行中调用Toast类的makeText()方法,该方法的作用是根据指定的内容创建Toast,其格式为

public static Toast makeText (Context context, CharSequence text,int duration)

其中,context表示应用程序或者活动的上下文;text即为指定显示的内容,duration指定了Toast显示的时间。在第6-7行中,通过continent调用getName()方法获取用户选中子项对应的数据,并将其作为Toast的显示内容;Toast.LENGTH_SHORT来指定Toast显示的时间,LENGTH_SHORT是Toast类的常量,表示默认的很短的时间,与其对应的是LENGTH_LONG常量,它表示比较长的时间。该方法的返回值是创建好的Toast变量。

之后通过创建好的Toast变量调用show()方法显示指定内容。

3 小结

今天学习了提高getView()效率的方法以及点击ListView子项显示指定内容的方法。通过getView()的convertView参数可以实现“旧”视图的使用而不必每次都要重新创建新视图,因而提高了该方法的效率。通过为ListView控件添加点击监视器的方法及Toast类实现了指定内容的显示。