在上一篇文章中實(shí)現(xiàn)了一個帶選擇框的listview。但是那個例子有個.很嚴(yán)重的問題:必須點(diǎn)擊選擇框才能選擇該列,這在模擬器上沒有什么大問題,可是在手機(jī)上時問題就來了。手機(jī)的屏幕一般很小,那個選擇框也會變得很小,如果有些人的指頭又粗的話,點(diǎn)擊選擇框是件很不爽的問題。一般的listview都要支持對整個列的點(diǎn)擊響應(yīng),在本例中就實(shí)現(xiàn)來這個功能。
這個例子是基于上個例子來實(shí)現(xiàn)的,只是做了一些修改,下面只對修改的地方做出說明。修改主要體現(xiàn)在showlist1.java上。這里用到了ListView.CHOICE_MODE_MULTIPLE,在androidAPIDEMO中實(shí)現(xiàn)帶選擇框的listview時就使用來該參數(shù),設(shè)置來該參數(shù)后,每次點(diǎn)擊listview都會n(n是要顯示的條目數(shù))次調(diào)用重寫的getview方法來更新各個條目的選擇狀態(tài)。在對Listitem的點(diǎn)擊事件中,更新記錄條目選擇狀態(tài)的ArrayList<Boolean> CheckItemm,這也是getview方法用來更新顯示狀態(tài)的依據(jù)。另外本例中去掉來上次中所用到的checkbox,而使用了CheckedTextView來代替,使實(shí)現(xiàn)起來能夠更加容易。值得一提的是,通過重寫getview方法,我們可以得到任何想要的view,也就是說,在listview每一行都是一個view,該view即為getview方法的返回值。
- package com.test;
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.CheckedTextView;
- import android.widget.ImageView;
- import android.widget.ListView;
- import android.widget.Toast;
- import java.util.ArrayList;
- public class ShowList1 extends Activity implements OnClickListener {
- private String TAG="showlist1";
- ListView list;
- Button button;
- ArrayList<String> array;
- ArrayList<Boolean> checkedItem=new ArrayList<Boolean>();
- private Bitmap mIcon1;
- CheckAdapter chadapter;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mIcon1 = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon48x48_1);
- setContentView(R.layout.list1);
- list=(ListView)findViewById(R.id.listView);
- button=(Button)findViewById(R.id.result);
- button.setOnClickListener(this);
- //get music names from other activity
- array=getIntent().getStringArrayListExtra("list");
- //init the check box status to unchecked
- for(int i=0;i<array.size();i++){
- checkedItem.add(i,false);
- }
- Log.d(TAG,array.toString());
- chadapter=new CheckAdapter(this);
- list.setAdapter(chadapter);
- list.setItemsCanFocus(false);
- list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
- list.setOnItemClickListener(new OnItemClickListener(){
- public void onItemClick(AdapterView<?> parent, Viewview, int position, long id) {
- //update the value of checked items
- if(checkedItem.get(position)==true){
- checkedItem.set(position,false);
- Log.d(TAG,"true");
- }
- else{
- checkedItem.set(position,true);
- Log.d(TAG,"false");
- }
- }
- });
- }
- /*
- * (non-Javadoc)
- * @see android.view.View.OnClickListener#onClick(android.view.View)
- * see which has been choosed
- */
- @Override
- public void onClick(View v) {
- String s="You have choosed ";
- for(int i=0;i<array.size();i++){
- if(checkedItem.get(i)){
- s=s+","+array.get(i);
- }
- }
- Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
- }
- class CheckAdapter extends BaseAdapter {
- private LayoutInflater mInflater;
- public CheckAdapter(Context context){
- this.mInflater=LayoutInflater.from(context);
- }
- public int getCount() {
- return array.size();
- }
- public Object getItem(int position) {
- return position;
- }
- public long getItemId(int position) {
- return position;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- Log.d(TAG,"getview");
- ImageView img;
- CheckedTextView name;
- View view;
- final int p=position;
- if(convertView==null){
- view=mInflater.inflate(R.layout.api,parent,false);
- }
- else{
- view=convertView;
- }
- img=(ImageView)view.findViewById(R.id.img);
- name=(CheckedTextView)view.findViewById(R.id.text);
- img.setImageBitmap(mIcon1);
- final String s=(String)array.get(position);
- name.setText(s);
- //display which item has been checked
- if(checkedItem.get(p)==true)
- name.setChecked(true);
- else
- name.setChecked(false);
- return view;
- }
- }
- }
最后修改的地方是布局文件,該文件命名為api.xml。在其中主有有兩部分,分別是ImageView和CheckedTextView,實(shí)現(xiàn)的界面同上例中的界面是相同的,圖片就不再貼出了。
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <ImageView
- android:id="@+id/img"
- android:layout_width="48dip"
- android:layout_height="48dip"
- android:layout_marginTop="7.0dip"
- android:layout_marginLeft="5.0dip"
- android:layout_marginRight="5.0dip"
- />
- <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/text"
- android:layout_width="fill_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="center_vertical"
- android:checkMark="?android:attr/listChoiceIndicatorMultiple"
- android:paddingLeft="6dip"
- android:paddingRight="6dip"
- android:layout_toRightOf="@id/img"
- />
- </RelativeLayout>
|