首先来个效果图:说明:点击test按钮Toast.makeText( "这是第" +position+ "条item") 点击listview的item也要弹出Toast
代码展示:
1、布局文件main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 添加一个ListView控件 --> <ListView android:id="@+id/test_lv" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>2、 列表项布局文件list_items.xml
这里要注意:如果listitem里面包括button或者checkbox等控件,默认情况下listitem会失去焦点,导致无法响应item的事件,最常用的解决办法是在listitem的布局文件中设置descendantFocusability属性。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants" > <LinearLayout android:id="@+id/ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/title_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/info_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <Button android:id="@+id/test_bt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" /> </RelativeLayout>3、 MainActivity,主代码:
package com.lexun.lexuninterview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.app.Activity; public class MainActivity extends Activity { private ListView listView; private TestAdapter testAdapter; private List<Map<String, Object>> listItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.test_lv); listItems = getListItems(); testAdapter = new TestAdapter(this, listItems); // 创建适配器 listView.setAdapter(testAdapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Toast.makeText(MainActivity.this, "点击的为:" + arg2, Toast.LENGTH_SHORT).show(); } }); } /** * 初始化listview信息 */ private List<Map<String, Object>> getListItems() { List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>(); for (int i = 0; i < 100; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put("title", "title:" + i); // title map.put("info", "info: this list item is" + i); // info listItems.add(map); } return listItems; } }4、 适配器代码:
package com.lexun.lexuninterview; 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.Button; import android.widget.TextView; import android.widget.Toast; public class TestAdapter extends BaseAdapter{ private Context context; // 运行上下文 private List<Map<String, Object>> listItems; // listview信息集合 private LayoutInflater listContainer; // 视图容器 public final class ListItemView { // 自定义控件集合 public TextView title; public TextView info; public Button test; } public TestAdapter(Context context, List<Map<String, Object>> listItems) { super(); this.context = context; this.listItems = listItems; listContainer = LayoutInflater.from(context); // 创建视图容器并设置上下文 } @Override public int getCount() { // 这里不能使用默认返回0,不然listview没数据 return listItems.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final int selectID = position; ListItemView listItemView = null; if (convertView == null) { listItemView = new ListItemView(); // 获取list_item布局文件的视图 convertView = listContainer.inflate(R.layout.list_items, null); listItemView.title = (TextView) convertView.findViewById(R.id.title_tv); listItemView.info = (TextView) convertView.findViewById(R.id.info_tv); listItemView.test = (Button) convertView.findViewById(R.id.test_bt); // 设置控件集到convertView convertView.setTag(listItemView); } else { listItemView = (ListItemView) convertView.getTag(); } listItemView.title.setText((String) listItems.get(position).get("title")); listItemView.info.setText((String) listItems.get(position).get("info")); listItemView.test.setText("test"); // 注册按钮点击事件 listItemView.test.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, "这是第" + (selectID + 1) + "条item", Toast.LENGTH_SHORT).show(); } }); return convertView; } }就这样就能达到想要的效果了。
最后: 总结下,这是今天面试遇到的机试题,大概就是这样。还讲到了ListView的优化,分页加载等。getView()中应该可以做些优化,下次在研究。看来还需要好好努力练习。多敲代码才是王道!