一、ListActivity类继承Activity类,默认绑定了一个ListView(列表视图)界面组件,并提供一些与列表视图、处理相关的操作。
一般首界面才用ListActivity。ListActivity中默认绑定ListView,其listView界面组件中的每一行(row)都可以被选择。我们可以借由设置一个onListItemClick方法,来得到用户正选择了哪一列的信息,并做后续处理。
列表视图在手持设备上运用很多,诸如在手机屏幕上显示通信录列表或电话列表,并让用户从中选择的动作,都属于ListActivity管理范围。开发者在开发常用的列表视图画面时,直接使用ListActivity类来开始,会比从Activity类来开始方便许多。
二、ListActivity:
封装了一个ListView和一个TextView(没有数据时提示)
注意:①给ListView设置适配器:setListAdapter();
②设置ListView的item点击事件:onListItemClick
比起Activity,ListActivity实现时需要注意以下几点:
1、ListActivity不用加载布局,即省略了setContentView(R.layout.main),它默认是LIstView占满屏。
2、如果想在屏幕中显示其他控件,如文本框和按钮之类,可以采用如下方法:
a、代码中添加:setContentView(R.layout.main)
b、在 main_activity.xml 文件中,添加一个ListView控件,和一个 TextView 控件,注意它们 id 必须为”@id/android:list”、”@id/android:empty”;前一个表示匹配的ListView,后一个表示若ListView没有内容则显示的提示。
如果想在屏幕中显示其他控件时activity_main.xml文件中的书写一定要注意listView和textView的id
<LinearLayout>
<ListView android:
id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
<TextView android:
id="@id/android:empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Can not find the file!" />
</LinearLayout>
MainActivity中的代码如下:
package org.moblie.train.zday10_listactivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
private List<Map<String, String>> list = new ArrayList<Map<String, String>>();
private MyAdapter adapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 若在main_activaty.xml中不添加其他控件时,ListActivity默认有ListView和TextView,故此处不用加载布局。
// setContentView(R.layout.activity_main);
initData();
initViews();
}
private void initViews() {
adapter = new MyAdapter(this, list);
// 此处直接调用setListAdapter。如果listView时通常先初始化listView,然后这么写:listView.setAdapter(adapter);
setListAdapter(adapter);
/**
* // 注意:ListActivity中Item的监听与ListView也有不同。 若是listView通畅这么写:
* getListView().setOnItemClickListener(new OnItemClickListener() {
*
* public void onItemClick(AdapterView<?> parent, View view, int
* position, long id) { } });
*/
}
// ListActivity中对Item的监听这么写:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
// 以下是两种获取Item内容的方式:
// 1.从适配器中获取Item数据(Map)
Map map = (Map) adapter.getItem(position);
// 或者 2.从ListView中获得数据
Map mapInList = (Map) l.getItemAtPosition(position);
String str = map.get("textView1") + ":" + map.get("textView2");
Toast.makeText(MainActivity.this, str, 0).show();
// makeText()的第三个参数用于设置显示时间,其中
// Toast.LENGTH_LONG可以用1代替
// Toast.LENGTH_SHORT可以用0代替
}
// 这个方法初始化数据用于给每个Item填充值
private void initData() {
for (int i = 0; i < 15; i++) {
Map<String, String> map = new HashMap<String, String>();
map.put("textView1", "this is " + i);
map.put("textView2", "position is " + i);
list.add(map);
}
}
}
item_listview.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"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
MyAdapter中的代码:
package org.moblie.train.zday10_listactivity;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
private List<Map<String, String>> list;
private Context contenxt;
private LayoutInflater inflater;
public MyAdapter(Context context, List<Map<String, String>> list) {
this.contenxt = context;
this.list = list;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return list == null ? 0 : list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_listview, parent,
false);
holder.textView1 = (TextView) convertView
.findViewById(R.id.textView1);
holder.textView2 = (TextView) convertView
.findViewById(R.id.textView2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView1.setText(list.get(position).get("textView1"));
holder.textView2.setText(list.get(position).get("textView2"));
return convertView;
}
class ViewHolder {
private TextView textView1;
private TextView textView2;
}
}