动态修改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