標籤:
大三學生一個,喜歡編程,喜歡Google,喜歡Android,所以選擇的方向自然是Android應用開發,開博第一篇,希望以後會有更多的進步。
最近在做一個記賬App的時候,需要一個Activity來顯示每個月的消費各個項目的比例,Activity中主要用到一個ListView,ListView中包括一個TextView來顯示類型的名稱,一個TextView來顯示所佔比例,一個ProgressBar來顯示進度條,讓每個條目的比例更加清晰。如(這裡只提供實現方法,介面效果暫不提供)
因為這種效果比較特別,需要我們自己來實現自訂的效果。下面來實現它:
一、定義每個Item的布局,tendency_list_item.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:descendantFocusability="beforeDescendants" android:paddingLeft="5dp" android:paddingRight="5dp" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:descendantFocusability="afterDescendants" > <TextView android:id="@+id/tendency_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp" android:layout_marginLeft="10dp" android:layout_marginTop="15dp" android:textSize="15sp" /> <ProgressBar android:id="@+id/tendency_progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/tendency_title" android:layout_marginBottom="15dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:max="100" android:progressDrawable="@drawable/progress_style" /> <TextView android:id="@+id/tendency_total" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="10dp" android:layout_marginTop="15dp" android:textSize="15sp" /> </RelativeLayout></FrameLayout>
複雜冗餘的可以無視,就是簡單的兩個TextView和一個ProgressBar而已
二、建立一個類,繼承BaseAdapter,可以是一個獨立的類,也可以是當前的activity中建立的一個內部類,重寫一些函數即可,這裡布局被寫入程式碼了,如果是封裝的一個外部類,可以通過參數傳進來
public class myAdapter extends BaseAdapter { private Context context; // 當前的Context private LayoutInflater mInflater; // 通過LayoutInflater來載入每個item的布局 private double total; // 跟項目有關,把總的金額數傳進來,這也是使用內部類的原因 List<Map<String, Object>> map; // 存放資料來源 public myAdapter(Context context, List<Map<String, Object>> map, double total) { this.context = context; this.mInflater = LayoutInflater.from(context); this.total = total; this.map = map; } // 重寫這個方法,獲得當前ListView共有多少個Item @Override public int getCount() { return listmap.size(); } // 重寫這個方法,獲得當前的position @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } // 一個輔助類 public class viewHolder { TextView title; ProgressBar progress; TextView sum; } // 一個最重要的方法,重寫它來把資料對應到布局上 @Override public View getView(int position, View view, ViewGroup parent) { view = mInflater.inflate(R.layout.tendency_list_item, null); // 載入Item的布局 viewHolder vh = new viewHolder(); // 建立輔助類 vh.title = (TextView) view.findViewById(R.id.tendency_title); // 通過Id擷取對象 vh.progress = (ProgressBar) view .findViewById(R.id.tendency_progressBar); vh.sum = (TextView) view.findViewById(R.id.tendency_total); vh.title.setText((String) map.get(position).get("type")); // 調用每個對象來把資料對應進去 double part = (Double) map.get(position).get("total"); String part2 = String.format("%.0f", part * 100 / total); vh.sum.setText(part2 + "%"); vh.progress.setProgress(Integer.parseInt(part2)); return view; } }
三、調用即可
myAdapter adapter = new myAdapter(tendency_activity.this, listmap, sum);show.setAdapter(adapter);
原理其實也比較簡單,在執行個體化的時候,先調用getCount()來計算有多少個Item,然後每個position都調用getView()來進行資料的映射(這樣效能不會很好,如何最佳化日後再補充)。
如有錯誤,還請指導更正,感謝!
Android開發學習之路-自訂ListView(繼承BaseAdapter)