Android開發學習之路-自訂ListView(繼承BaseAdapter)

來源:互聯網
上載者:User

標籤:

大三學生一個,喜歡編程,喜歡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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.