歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android ListView自定義和選中效果

Android ListView自定義和選中效果

日期:2017/3/1 10:52:17   编辑:Linux編程
1.自定義列表框的每項

layout文件夾中創建xml文件,在自定義的adapter的getview方法中加載。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:weightSum="1">
  7. <LinearLayout android:orientation="horizontal"
  8. android:layout_width="fill_parent"
  9. android:layout_height="40px"
  10. android:id="@+id/layout"
  11. android:padding="6px">
  12. <ImageView android:id="@+id/icon"
  13. android:layout_width="18dip"
  14. android:layout_height="18dip"
  15. android:layout_marginLeft="2dip"
  16. android:layout_marginRight="2dip" />
  17. <TextView android:id="@+id/text"
  18. android:layout_gravity="center_horizontal"
  19. android:layout_width="fill_parent"
  20. android:layout_height="wrap_content" />
  21. </LinearLayout>
  22. </LinearLayout>
2.自定義列表框適配器adapter
自定義adapter,繼承自BaseAdapter,在getview方法中為當前項賦值並添加選中效果。
  1. import android.content.Context;
  2. import android.content.res.Resources;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.Color;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.ImageView;
  11. import android.widget.LinearLayout;
  12. import android.widget.TextView;
  13. public class ListviewAdapter extends BaseAdapter{
  14. private LayoutInflater inflater = null;
  15. private ArrayList<String> items = null;
  16. private Bitmap icon;
  17. private int selectedPosition = -1;
  18. public void setSelectedPosition(int position) {
  19. selectedPosition = position;
  20. }
  21. public ListviewAdapter(Context context, ArrayList<String> arraylist) {
  22. // TODO Auto-generated constructor stub
  23. // LayoutInflater用來加載界面
  24. inflater = LayoutInflater.from(context);
  25. // 保存適配器中的每項的文字信息
  26. this.items = arraylist;
  27. // 獲得資源中的圖片作為要顯示的圖標
  28. Resources res = context.getResources();
  29. this.icon = BitmapFactory.decodeResource(res, R.drawable.icon);
  30. }
  31. @Override
  32. public int getCount() {
  33. // TODO Auto-generated method stub
  34. return items.size();
  35. }
  36. @Override
  37. public Object getItem(int position) {
  38. // TODO Auto-generated method stub
  39. return items.get(position);
  40. }
  41. @Override
  42. public long getItemId(int position) {
  43. // TODO Auto-generated method stub
  44. return position;
  45. }
  46. // 保存每項中的控件的引用
  47. class ViewHolder {
  48. TextView text;
  49. ImageView icon;
  50. LinearLayout layout;
  51. }
  52. @Override
  53. public View getView(int position, View convert, ViewGroup parent) {
  54. // TODO Auto-generated method stub
  55. ViewHolder holder;
  56. if(convert == null)
  57. {
  58. // 調用LayoutInflater的inflate方法加載layout文件夾中的界面
  59. convert = inflater.inflate(R.layout.list_row, null);
  60. holder = new ViewHolder();
  61. holder.text = (TextView)convert.findViewById(R.id.text);
  62. holder.icon = (ImageView)convert.findViewById(R.id.icon);
  63. holder.layout = (LinearLayout)convert.findViewById(R.id.layout);
  64. // 保存包含當前項控件的對象
  65. convert.setTag(holder);
  66. } else {
  67. // 獲取包含當前項控件的對象
  68. holder = (ViewHolder)convert.getTag();
  69. }
  70. // 設置當前項的內容
  71. holder.text.setText(items.get(position));
  72. holder.icon.setImageBitmap(icon);
  73. // 設置選中效果
  74. if(selectedPosition == position)
  75. {
  76. holder.text.setTextColor(Color.BLUE);
  77. holder.layout.setBackgroundColor(Color.YELLOW);
  78. } else {
  79. holder.text.setTextColor(Color.WHITE);
  80. holder.layout.setBackgroundColor(Color.TRANSPARENT);
  81. }
  82. return convert;
  83. }
  84. }
3.主activity
添加列表框項目的點擊事件,更新列表框實現選中效果的目的。
  1. import java.util.ArrayList;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.AdapterView;
  6. import android.widget.ListView;
  7. import android.widget.AdapterView.OnItemClickListener;
  8. public class TestActivity extends Activity {
  9. private ListviewAdapter listAdapter;
  10. /** Called when the activity is first created. */
  11. @Override
  12. public void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. // 初始化列表框裡顯示的內容
  16. ArrayList<String> list = new ArrayList<String>();
  17. for(int i=1; i<20; i++)
  18. list.add("Line " + i);
  19. // 為列表框添加適配器
  20. ListView listview = (ListView)this.findViewById(R.id.listview);
  21. listAdapter = new ListviewAdapter(this, list);
  22. listview.setAdapter(listAdapter);
  23. // 添加列表框項目點擊事件
  24. listview.setOnItemClickListener(new OnItemClickListener() {
  25. @Override
  26. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
  27. // 設置適配器的選中項
  28. listAdapter.setSelectedPosition(arg2);
  29. // 更新列表框
  30. listAdapter.notifyDataSetInvalidated();
  31. }
  32. });
  33. }
  34. }
4.主acitivity的界面
為防止列表框滾動時背景會變黑,添加 android:cacheColorHint="#00000000" 屬性。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:weightSum="1">
  7. <TextView android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:text="Listview:"
  10. android:textSize="8pt"
  11. android:gravity="left" />
  12. <ListView android:id="@+id/listview"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:cacheColorHint="#00000000" />
  16. </LinearLayout>
Copyright © Linux教程網 All Rights Reserved