前一天学习了ListView控件中显示图像和文字的方法。通过设置ListView控件的适配器实现。该适配器为自定义适配器,在自定义适配器中,重写getView()方法,设置ListView每个子项的数据、布局以及布局中各控件显示的内容。
当ListView子项每次显示的时候,自定义适配器中的getView()方法都会被调用。而在getView()方法的每次调用都要涉及到布局XML文件的导入,这样使得程序运行起来效率非常低下,今天我们将解决这个问题。今天还要实现的是点击ListView控件的某个子项,则在屏幕下方显示该项对应的内容,如图1所示。
图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类实现了指定内容的显示。