天天看點

ListView五行換色效果

原創作品,允許轉載,轉載時請務必以超連結形式标明文章 原始出處 、作者資訊和本聲明。否則将追究法律責任。http://mzh3344258.blog.51cto.com/1823534/810411

一:五行換色效果 

ListView五行換色效果
二:快速拖動塊顯示效果
ListView五行換色效果
三:循環從0開始時的效果圖三 這個地方貼此圖原因大家看主要制代碼中的注釋
ListView五行換色效果
四:循環從0開始時的效果圖四
ListView五行換色效果
五:單擊按鈕後觸發事件(小工具做的,有點失真,真機上正常的,大家放心)
ListView五行換色效果
六:工程結構圖如下
ListView五行換色效果
七:主要制類代碼如下:

  1. package com.xiaoma.listviewbackground; 
  2. import java.util.ArrayList; 
  3. import java.util.HashMap; 
  4. import java.util.HashSet; 
  5. import java.util.List; 
  6. import java.util.Map; 
  7. import java.util.Set; 
  8. import java.util.TreeSet; 
  9. import android.app.Activity; 
  10. import android.app.Dialog; 
  11. import android.app.ProgressDialog; 
  12. import android.content.Context; 
  13. import android.graphics.drawable.Drawable; 
  14. import android.os.Bundle; 
  15. import android.util.Log; 
  16. import android.view.LayoutInflater; 
  17. import android.view.View; 
  18. import android.view.View.OnClickListener; 
  19. import android.view.ViewGroup; 
  20. import android.widget.AdapterView; 
  21. import android.widget.AdapterView.OnItemSelectedListener; 
  22. import android.widget.BaseAdapter; 
  23. import android.widget.Button; 
  24. import android.widget.ImageView; 
  25. import android.widget.ListView; 
  26. import android.widget.TextView; 
  27. import android.widget.Toast; 
  28. /**   
  29. * @Title: ListViewBackgroundDemoActivity.java 
  30. * @Package com.xiaoma.listviewbackground 
  31. * @Description: 小馬學習隔行換色,一定仔細看注釋 
  32. * @author XiaoMa 
  33. */ 
  34. public class ListViewBackgroundDemoActivity extends Activity 
  35.             implements OnItemSelectedListener{ 
  36.     private ListView lv = null; 
  37.     /** Called when the activity is first created. */ 
  38.     @Override 
  39.     public void onCreate(Bundle savedInstanceState) { 
  40.         super.onCreate(savedInstanceState); 
  41.         setContentView(R.layout.main); 
  42.         lv = (ListView)findViewById(R.id.listview); 
  43.         /** 
  44.          * 設定快速滾動塊可用,這個大家注意下,就是設定之後,ListView 
  45.          * 裡面的資料條數必須大于一定數量(小馬試了下,這個數量是大于一屏) 
  46.          * 才會顯示這個小拖塊,不然無效 
  47.          */ 
  48.         lv.setFastScrollEnabled(true); 
  49.         lv.setOnItemSelectedListener(this); 
  50.         lv.setAdapter(new ListDemoAdapter(getApplicationContext())); 
  51.     } 
  52.     /** 
  53.     * @Title: ListViewBackgroundDemoActivity.java 
  54.     * @Package com.xiaoma.listviewbackground 
  55.     * @Description:擴充卡實作  
  56.     * @author XiaoMa 
  57.      */ 
  58.     private class ListDemoAdapter extends BaseAdapter{ 
  59.         private static final int ITEM = 0; 
  60.         private static final int SEPARATOR = 1; 
  61.         private static final int TYPE_MAX_COUNT = SEPARATOR + 1; 
  62.         private LayoutInflater inflater = null ; 
  63.         private List<String> listItem = new ArrayList<String>(); 
  64.         /* 
  65.          * 用這個set來儲存分隔線的位置,這個地方必須注意,小馬寫兩個不同類型的Set來跟大家複習下 
  66.          * 這兩個小東東的不同之處,效果太神奇了,這個Set你該用哪個會直接影響到換色效果的,不同之 
  67.          * 處是: 
  68.          *  
  69.          * TreeSet:基于 TreeMap 的 NavigableSet 實作。使用元素的自然順序對元素進行排序 
  70.          *               或者根據建立 set 時提供的 Comparator 進行排序,具體取決于使用的構造方法 
  71.          *  
  72.          * Set:一個不包含重複元素的 collection。更确切地講,set 不包含滿足 e1.equals(e2)  
  73.          *     的元素對 e1 和 e2,并且最多包含一個 null 元素。正如其名稱所暗示的,此接口模仿了數學 
  74.          *     上的 set 抽象 
  75.          */ 
  76.         @SuppressWarnings("rawtypes") 
  77.         //private Set set = new HashSet(); 
  78.         private TreeSet set = new TreeSet(); 
  79.         private Map map = new HashMap(); 
  80.         public ListDemoAdapter(Context context ){ 
  81.             this.inflater = LayoutInflater.from(context); 
  82.             /** 
  83.              * 大家稍微注意下這個循環,i從1開始?為什麼?  小馬在這犯的錯 
  84.              * 每5條資料加一條換色Item是用 i%6 == 0來控制的,如果這 
  85.              * 個i值從0開始的話,會出現上面貼圖中錯誤的換色,看圖三,圖四, 
  86.              * 原因是取餘的時候小馬犯了低級錯誤,小錯,記下:兩數取餘,前者 
  87.              * 大于後者時,取餘會按正常取餘來取,如果前者小于後者時,取餘 
  88.              * 後的值始終是前者,如果這個地方的i從0開始取的話,正好是滿 
  89.              * 足取餘後的值等于0這個情況,就出現上面兩圖中的錯誤隔×××了, 
  90.              * 目前者大于等于後者時,這個隔色就又正常了,一定注意下,記在這, 
  91.              * 提醒大家也提醒自己,吼吼,聽不明白的可以看下小馬在工程中加的 
  92.              * 一個測試類(測試取餘規律的類PercentTest.java) 
  93.              */ 
  94.             //填充ListView 
  95.             for(int i=1;i<=50;i++){ 
  96.                 this.listItem.add("添加的第"+i+"條資料"); 
  97.                 if(i%6 == 0){ 
  98.                     addSeparatorItem(); 
  99.                 } 
  100.                 Log.i("KKK", "添加的第"+i+"條資料"); 
  101.             } 
  102.         } 
  103.         /** 
  104.          * 添加換色項方法實作 
  105.          * @param item 
  106.          */ 
  107.         @SuppressWarnings("unchecked") 
  108.         public void addSeparatorItem() { 
  109.             set.add(listItem.size()-1); 
  110.             notifyDataSetChanged(); 
  111.         } 
  112.         /** 
  113.          * 此處是根據特定值(在getView方法中加入) 
  114.          * 來判斷應該繪制選項還是換色選項的分支值 
  115.          * 由position傳回view type id 
  116.          */ 
  117.         @Override 
  118.         public int getItemViewType(int position) { 
  119.             return set.contains(position) ? SEPARATOR : ITEM; 
  120.         } 
  121.         /** 
  122.          * 傳回你有多少個不同的布局 
  123.          */ 
  124.         @Override 
  125.         public int getViewTypeCount() { 
  126.             return TYPE_MAX_COUNT; 
  127.         } 
  128.         @Override 
  129.         public int getCount() { 
  130.             return listItem.size(); 
  131.         } 
  132.         @Override 
  133.         public Object getItem(int position) { 
  134.             return listItem.get(position); 
  135.         } 
  136.         @Override 
  137.         public long getItemId(int position) { 
  138.             return position; 
  139.         } 
  140.         /** 
  141.          * 這個地方也需要注意下,小馬這個方法裡面寫的有點多了,其實官方是不支援在 
  142.          * getView()方法中寫太多的邏輯因為你手拖下螢幕,這個方法是逛調用 
  143.          * 的,是以太多邏輯不适合放在這個地方,大家可自行調整下,但有些還是必 
  144.          * 須的,寫在這無防...吼吼 
  145.          */ 
  146.         @Override 
  147.         public View getView(int position, View convertView, ViewGroup parent) { 
  148.             int type = getItemViewType(position); 
  149.             XiaoMa xiaoMa = null; 
  150.             final int location = position; 
  151.             if(convertView == null){ 
  152.                 switch (type) { 
  153.                 //如果需要繪制選項時分支 
  154.                 case ITEM: 
  155.                     xiaoMa = new XiaoMa(); 
  156.                     convertView = inflater.inflate(R.layout.listview_items, null); 
  157.                     xiaoMa.iv = (ImageView)convertView.findViewById(R.id.ItemImage); 
  158.                     xiaoMa.tv = (TextView)convertView.findViewById(R.id.ItemTitle); 
  159.                     xiaoMa.text = (TextView)convertView.findViewById(R.id.itemtext); 
  160.                     xiaoMa.btn = (Button)convertView.findViewById(R.id.view_btn); 
  161.                     break; 
  162.                 //如果需要繪制換色選項時分支 
  163.                 case SEPARATOR: 
  164.                     xiaoMa = new XiaoMa(); 
  165.                     convertView = inflater.inflate(R.layout.listview_items, null); 
  166.                     xiaoMa.iv = (ImageView)convertView.findViewById(R.id.ItemImage); 
  167.                     xiaoMa.tv = (TextView)convertView.findViewById(R.id.ItemTitle); 
  168.                     xiaoMa.text = (TextView)convertView.findViewById(R.id.itemtext); 
  169.                     xiaoMa.btn = (Button)convertView.findViewById(R.id.view_btn); 
  170.                     convertView = inflater.inflate(R.layout.separator, null); 
  171.                     /* 
  172.                      * 這個地方的drawable2用法跟在ListView換色選項布局中的 
  173.                      * android:background="@drawable/gradient_box" 
  174.                      * 效果是一樣的,小馬寫在這,熟悉下兩種方式,大家根據自己需要改 
  175.                      */ 
  176.                     Drawable drawable2 = getResources().getDrawable(R.drawable.gradient_box); 
  177.                     xiaoMa.sep = (TextView)convertView.findViewById(R.id.sep); 
  178.                     xiaoMa.sep.setBackgroundDrawable(drawable2); 
  179.                     break; 
  180.             } 
  181.                 /*  
  182.                  * 此處小馬犯錯了,如果下面這句不加的話, 
  183.                  * 加載時正常,拖動清單時就會報空指針了, 
  184.                  * 小點注意下 
  185.                  */ 
  186.                 convertView.setTag(xiaoMa); 
  187.             }else{ 
  188.                 xiaoMa = (XiaoMa)convertView.getTag(); 
  189.             } 
  190.             xiaoMa.iv.setBackgroundResource(R.drawable.xiaolvzi); 
  191.             xiaoMa.tv.setText("這是第"+(position+1)+"個标題"); 
  192.             xiaoMa.text.setText("這是第"+(position+1)+"個概述"); 
  193.             /** 
  194.              * 按鈕事件監聽實作 
  195.              */ 
  196.             xiaoMa.btn.setOnClickListener(new OnClickListener() { 
  197.                 @Override 
  198.                 public void onClick(View v) { 
  199.                     //單擊Item按鈕後,彈出提示 
  200.                     ShowDialog(location);    
  201.                 } 
  202.             }); 
  203.             return convertView; 
  204.         } 
  205.     } 
  206.     /** 
  207.      * 彈出提示實作,這個地方擴充一下,細心的話大家會發現小馬違反了方法命名規範,其實不是的, 
  208.      * 安卓Activity有臨時彈出對話框方法的,跟下面這個方法隻有一個字母之差(小馬故意 
  209.      * 首字母大寫的),安卓自帶彈出方法在這個方法下面的注釋中 
  210.      * @param posi 
  211.      */ 
  212.     private void ShowDialog(int posi){ 
  213.         Toast.makeText(getApplicationContext(), "單擊了第"+(posi+1) 
  214.                 +"個按鈕", Toast.LENGTH_SHORT).show(); 
  215.         /* 
  216.          * 下面這兩個方法大家熟悉吧?調用系統提供的臨時彈出對話框,必須實作下面的 
  217.          * onCreateDialog(int id)方法 
  218.          */ 
  219.         showDialog(1);//彈出時可以做如:從伺服器取資料等操作 
  220.         /** 
  221.          * 這個地方小馬就簡單的睡眠5秒種來模拟從伺服器下載下傳資料完成後關閉對話框 
  222.          */ 
  223.         new Thread(new Runnable() { 
  224.             @Override 
  225.             public void run() { 
  226.                 try { 
  227.                     Log.i("KKK", "已進入睡眠"); 
  228.                     Thread.sleep(3000); 
  229.                     dismissDialog(1);//隐藏 表示資料下載下傳完畢等的... 
  230.                 } catch (Exception e) { 
  231.                     e.printStackTrace(); 
  232.                 } 
  233.             } 
  234.         }).start(); 
  235.     } 
  236.     @Override 
  237.     protected Dialog onCreateDialog(int id) { 
  238.         /* 
  239.          * 下面這個構造器中的this不能用getApplicationContext()來代替, 
  240.          * 但可用類名.this來代替,沒有為什麼, 必須這樣寫!!!這個地方小馬暈了 
  241.          * 不少時間,如果直接get....代碼沒錯,但還是會報錯,很邪門的哦 ... 
  242.          */ 
  243.         ProgressDialog dialog = new ProgressDialog(this); 
  244.         //小測試,中文就臨時寫這了,大家要注意把内容都寫到string.xml中去,好習慣從小開始養,嘿嘿 
  245.         dialog.setCancelable(false);//設定使用者不能用傳回鍵取消對話框 
  246.         dialog.setIcon(getResources().getDrawable(R.drawable.xiaolvzi)); 
  247.         dialog.setTitle("那些年,我們一起追的女孩"); 
  248.         dialog.setMessage("小馬果 呆丫頭 O_O"); 
  249.         dialog.show(); 
  250.         return dialog; 
  251.     } 
  252.     /** 
  253.     * @Title: ListViewBackgroundDemoActivity.java 
  254.     * @Package com.xiaoma.listviewbackground 
  255.     * @Description: 為提高加載效率而寫的類,可以看下ListView優化 
  256.     * @author XiaoMa 
  257.      */ 
  258.     public final class XiaoMa{ 
  259.         public  ImageView iv ; 
  260.         public TextView tv ;  
  261.         public Button btn ; 
  262.         public TextView text; 
  263.         public TextView sep; 
  264.     } 
  265.     @Override 
  266.     public void onItemSelected(AdapterView<?> parent, View view, int position, 
  267.             long id) { 
  268.     } 
  269.     @Override 
  270.     public void onNothingSelected(AdapterView<?> parent) { 
  271.     } 

八:臨時測試類代碼如下(小兒科的東西,但還是注意下):

  1. package com.xiaoma.listviewbackground; 
  2. /**   
  3. * @Title: PercentTest.java 
  4. * @Package com.xiaoma.listviewbackground 
  5. * @Description: 測試取餘規律,必須在JAVA工程下Run,别直接在這跑 
  6. * @author XiaoMa 
  7. */ 
  8. public class PercentTest { 
  9.  public static void main(String[] args) { 
  10.     int a = 15; 
  11.     int b = 9; 
  12.     System.out.println("9%15 = "+9%15); 
  13.     System.out.println("15%9 = "+15%9); 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:orientation="vertical" > 
  6.    <!--  Back Up <ListView  
  7.         android:id="@+id/listview" 
  8.         android:layout_width="wrap_content" 
  9.         android:layout_height="fill_parent" 
  10.         android:smoothScrollbar="true" 
  11.         android:drawSelectorOnTop="false" 
  12.         android:listSelector="#00000000" 
  13.         /> 
  14.    --> 
  15.     <ListView  
  16.         android:id="@+id/listview" 
  17.         android:layout_width="fill_parent" 
  18.         android:layout_height="fill_parent" 
  19.         android:smoothScrollbar="true" 
  20.         android:choiceMode="none" 
  21.         android:focusable="false" android:scrollingCache="false" 
  22.         android:clickable="false" android:dividerHeight="0.5dip" 
  23.         /> 
  24.    <!--   <ListView android:id="@+id/list_coupon"  
  25.         android:layout_height="wrap_content" 
  26.         android:drawSelectorOnTop="false" android:choiceMode="none" 
  27.         android:focusable="false" android:scrollingCache="false" 
  28.         android:fadingEdge="none" android:focusableInTouchMode="false" 
  29.         android:clickable="false" android:dividerHeight="0.5dip" 
  30.         android:divider="@drawable/separator" /> 
  31.     --> 
  32. </LinearLayout>