建立自己的TextView和ImageView的組合View類
https://www.cnblogs.com/hibraincol/archive/2010/09/25/1834869.html
在編寫Android應用程序時,很多時候都需要自己來擴張Android的view類。 這裏介紹一個最基本的擴展View類:利用TextView和ImageView組合成我們自己的IconTextView類。
第一步:我們必須先創建一個包含了有String mText 和 Drawable mIcon數據成員的類,並且該類中應包含有對這兩個數據成員進行Set和Get的成員函數。
package hi.braincol.local.filebrowser.icontextlist;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.graphics.drawable.Drawable;
//IconText類,該類中主要有兩個數據成員:String mText 和 Drawable mIcon。
//並實現了泛型接口Comparable<?>,實現這個接口的目的是為了
//讓類似於"List<IconText> Entries = new ArrayList<IconText>();"
//的對象Entries具有排序功能"Collections.sort(Entries);"
public class IconText implements Comparable<IconText>{
private String mText = " ";
private Drawable mIcon;
private boolean mSelectable = true;
public IconifiedText(String text, Drawable bullet) {
mIcon = bullet;
mText = text;
}
public boolean isSelectable() {
return mSelectable;
}
public void setSelectable(boolean selectable) {
mSelectable = selectable;
}
//獲取Text
public String getText() {
return mText;
}
//設置Text
public void setText(String text) {
mText = text;
}
//獲取Icon
public void setIcon(Drawable icon) {
mIcon = icon;
}
//設置Icon
public Drawable getIcon() {
return mIcon;
}
//Comparable<?>接口中的方法
@Override
public int compareTo(IconText other) {
if(this.mText != null)
return this.mText.compareTo(other.getText());
else
throw new IllegalArgumentException();
}
}
第二步:創建一個TextView和ImageView組合成的View子類.
package hi.braincol.local.filebrowser.icontextlist;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
//創建一個text和Icon組合的view子類
//繼承與LinerLayout表示兩個IconTextView中的TextView和ImageView之間是線性布局關係。
public class IconTextView extends LinearLayout {
//類中的兩個私有成員,Text和Icon
//IconifiedTextView中的兩個子View。由TextView和ImageView組合成一個新的View。
private TextView mText;
private ImageView mIcon;
public IconifiedTextView(Context context, IconText aIconText) {
super(context);
/* First Icon and the Text to the right (horizontal),
* not above and below (vertical) */
//設置IconifiedTextView為水平線性布局
this.setOrientation(HORIZONTAL);
//垂直居中對齊
this.setGravity(Gravity.CENTER_VERTICAL);
//添加ImageView
mIcon = new ImageView(context);
mIcon.setImageDrawable(aIconText.getIcon());
// left, top, right, bottom
mIcon.setPadding(0, 2, 5, 2); // 5px to the right
/* At first, add the Icon to ourself
* (! we are extending LinearLayout) */
addView(mIcon, new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
//添加TextView, 由於先添加ImageView後添加TextView,所以 ICON 在前 Text 在後。
mText = new TextView(context);
mText.setText(aIconText.getText());
/* Now the text (after the icon) */
mText.setTextSize(17);
mText.setPadding(5,2,2,0);
//mText.setGravity(CENTER_VERTICAL);
addView(mText, new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
//設置TextView的Text內容
public void setText(String words) {
//Log.i("test","setText "+words);
mText.setText(words);
}
//設置ImageView的Icon圖標
public void setIcon(Drawable bullet) {
//Log.i("test","setIcon ");
mIcon.setImageDrawable(bullet);
}
}
第三步:建立一個BaseAdapter的子類用於Activity的布局(顯示),也就是將很多IconTextView組合在一起。
package hi.braincol.local.filebrowser.icontextlist;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
//創建一個由IconText組成的ListAdapter。
public class IconTextListAdapter extends BaseAdapter {
/** Remember our context so we can use it when constructing views. */
private Context mContext;
//創建一個數組適配器,適配器中每個元素為IconText
private List<IconText> mItems = new ArrayList<IconText>();
public IconTextListAdapter(Context context) {
mContext = context;
}
//向適配器內增加元素
public void addItem(IconText it) { mItems.add(it); }
//設置適配器
public void setListItems(List<IconText> lit) { mItems = lit; }
/** @return The number of items in the List<IconText> mItems*/
public int getCount() { return mItems.size(); }
//獲取positon指定位置的IconifiedText元素
public Object getItem(int position) { return mItems.get(position); }
public boolean areAllItemsSelectable() { return false; }
//判斷適配器內某個元素是否被選中
public boolean isSelectable(int position) {
//Log.i("braincol","isSelectable");
return mItems.get(position).isSelectable();
}
/** Use the array index as a unique id. */
public long getItemId(int position) {
return position;
}
//外部的類內的方法通過調用setListAdapter(IconTextListAdapter obj)
//實現將IconTextListAdapter作為Activtiy的顯示(布局)。
//在顯示之前係統會調用getView這個函數來獲得適配器內的每個元素的顯示方式(內容)。
//每個元素的顯示都會調用getView這個函數,也就是在顯示時有多少個元素就會調用多少次getView
/** @param convertView The old view to overwrite, if one is passed
* @returns a IconTextView that holds wraps around an IconText */
public View getView(int position, View convertView, ViewGroup parent) {
Log.i("braincol","getView");
//每個IconText的顯示方式為IconTextView。
IconTextView btv;
if (convertView == null) {
btv = new IconTextView(mContext, mItems.get(position));
} else { // Reuse/Overwrite the View passed
// We are assuming(!) that it is castable!
btv = (IconTextView) convertView;
btv.setText(mItems.get(position).getText());
btv.setIcon(mItems.get(position).getIcon());
}
return btv;
}
}
第四步:使用IconTextListAdapter將我們自定義的布局顯示在activity上,下麵的代碼的具體實現應該放在activity子類的某個成員方法中。
...
List<IconText> entries = new ArrayList<IconText>();
String text=" ";
Drawable icon = null;
...
for(...){
...
text="xxx";
icon=getResources().getDrawable(R.drawable.xxxx);
...
//向ArrayList中添加元素
entries.add(new IconifiedText(text,icon);
...
}
...
//排序,entries之所以能使用Collections.sort來排序,
//是因為IconText 實現了 Comparable<IconText>接口
Collections.sort(entries);
//新建一個IconifiedTextListAdapter對象
IconTextListAdapter itla = new IconTextListAdapter(this);
//設置itla的內容(元素)。
itla.setListItems(entries);
//provide the cursor for listview
//將itla的每個元素都描繪(顯示)在activity上。
this.setListAdapter(itla);
...
最後更新:2017-04-02 17:51:24