動態修改ListView文字大小
寫了一個MyAdapter(繼承了BaseAdapter)去實現數據和UI的顯示。通過滑動SeekBar來改變MyAdapter的getView方法中View的字體大小進而實現了改變ListView中文字大小的效果。
效果圖:
1 MainActivity的佈局文件main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listview01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
></ListView>
<SeekBar
android:id="@+id/seekbar01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
2 ListView的item佈局文件main_listview01_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="23sp"
/>
<TextView
android:id="@+id/textView02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
/>
</LinearLayout>
3 MyAdapter源碼
/**
* 我的適配器
* @author haozi
*
*/
public class MyAdapter extends BaseAdapter {
public static int PROGRESS;
private Context context;
private List<? extends Map<String, ?>> mData;
private int mResource;
private String[] mFrom;
private int[] mTo;
private LayoutInflater mLayoutInflater;
/**
* 我的適配器的構造方法
* @param context 調用方的上下文
* @param data 數據
* @param resource
* @param from
* @param to
*/
public MyAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to){
this.context = context;
this.mData = data;
this.mResource = resource;
this.mFrom = from;
this.mTo = to;
this.mLayoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
}
/**
* 系統在繪製ListView之前,將會先調用getCount方法來獲取Item的個數
*/
public int getCount() {
return this.mData.size();
}
public Object getItem(int position) {
return this.mData.get(position);
}
public long getItemId(int position) {
return position;
}
/**
* 每繪製一個 Item就會調用一次getView方法,
* 在此方法內就可以引用事先定義好的xml來確定顯示的效果並返回一個View對象作爲一個Item顯示出來。
* 也 正是在這個過程中完成了適配器的主要轉換功能,把數據和資源以開發者想要的效果顯示出來。
* 也正是getView的重複調用,使得ListView的使用更 爲簡單和靈活。
* 這兩個方法是自定ListView顯示效果中最爲重要的,同時只要重寫好了就兩個方法,ListView就能完全按開發者的要求顯示。
* 而 getItem和getItemId方法將會在調用ListView的響應方法的時候被調用到。
* 所以要保證ListView的各個方法有效的話,這兩個方法也得重寫。
*/
public View getView(int position, View contentView, ViewGroup parent) {
contentView = this.mLayoutInflater.inflate(this.mResource, parent, false);
// 設置contentView的內容和樣式,這裏重點是設置contentView中文字的大小
for(int index=0; index<this.mTo.length; index++){
TextView textView = (TextView) contentView.findViewById(this.mTo[index]);
textView.setText(this.mData.get(position).get(this.mFrom[index]).toString());
if(index == 0){
textView.setTextSize(23+PROGRESS);
}else if(index == 1){
textView.setTextSize(15+PROGRESS);
}
}
return contentView;
}
}
4 MainActivity源碼
/**
* 入口Activity
* @author haozi
*
*/
public class MainActivity extends Activity {
private ListView mListView;
private SeekBar mSeekBar;
private MyAdapter myAdapter;
private ArrayList<HashMap<String, String>> data;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
// 代碼和控件綁定
this.mListView = (ListView) this.findViewById(R.id.listview01);
this.mSeekBar = (SeekBar) this.findViewById(R.id.seekbar01);
// 準備數據
initData();
// 設置SeekBar變化監聽
this.mSeekBar.setOnSeekBarChangeListener(new MSeekBarOnSeekBarChangeListener());
}
/**
* 準備數據
*/
private void initData(){
data = new ArrayList<HashMap<String,String>>();
for(int index=0; index<5; index++){
HashMap<String, String> map = new HashMap<String, String>();
String textView01content = "textView01content" + index;
String textView02content = "textView02content" + index;
map.put("textView01", textView01content);
map.put("textView02", textView02content);
data.add(map);
}
// 創建適配器,並把數據交給適配器
this.myAdapter = new MyAdapter(this, data, R.layout.main_listview01_item,
new String[]{"textView01", "textView02"},
new int[]{R.id.textView01, R.id.textView02});
// 爲listView添加適配器
this.mListView.setAdapter(this.myAdapter);
}
/**
* mSeekBar的變化監聽
* @author haozi
*
*/
class MSeekBarOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener{
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
MyAdapter.PROGRESS = progress/10;
MainActivity.this.mListView.setAdapter(MainActivity.this.myAdapter);
}
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
}
}
demo下載鏈接地址:http://download.csdn.net/detail/hello_haozi/4290909