Android ListView填充數據的方法
因為多人開發,為了是自己開發的模塊方便融合到主框架中,同時也為了減小apk的大小,要求盡可能少的使用xml的布局文件,開發中需要在ListView中顯示數據,網上查到的幾乎所有的示例,都是通過xml文件來為ListView的Item提供布局樣式,甚是不方便。
能不能將自己通過代碼創建的布局(如View,LinearLayout)等動態的布局到ListView呢?當然可以。
為了給ListView提供數據,我們需要為其設置一個適配,我們可以從BaseAdapter繼承,然后重寫它的getView方法,這個方法中有一個參數convertView,我們可以將它設置為我們自定義的視圖并返回,來實現加載用代碼定義好的布局。
定義一個LinearLayout布局,它是繼承自View的,所以可以通過getView返回(注意:不要為這個布局使用 LinearLayout.LayoutParams 參數,因為ListView不識別,他識別的是AbsListView LayoutParams)
代碼如下:
public class PriceBoard extends LinearLayout { private ListView listView; private List items; private LinearLayout.LayoutParams params; public PriceBoard(Context context, AttributeSet attrs) { super(context, attrs); items = new ArrayList(); this.setOrientation(HORIZONTAL); params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); listView = new ListView(context); listView.setLayoutParams(params); PriceBoardAdapter priceBoardAdapter = new PriceBoardAdapter(context); listView.setAdapter(priceBoardAdapter); addView(listView, params); } public void add(PriceData data){ PriceBoardItem item = new PriceBoardItem(this.getContext(),null); item.setItem(data); items.add(item); params.setMargins(10,0,0,2); // item.setLayoutParams(params); } public PriceBoardItem getItemView(int index){ return (PriceBoardItem)items.get(index); } private class PriceBoardItem extends LinearLayout{ private TextView nameView; private TextView enCodeView; private TextView priceView; private PriceData priceData; public PriceBoardItem(Context context, AttributeSet attrs) { super(context, attrs); this.setOrientation(HORIZONTAL); nameView = new TextView(context); nameView.setTextSize(TypedValue.COMPLEX_UNIT_PX,38); enCodeView = new TextView(context); enCodeView.setTextSize(TypedValue.COMPLEX_UNIT_PX,28); priceView = new TextView(context); priceView.setTextSize(TypedValue.COMPLEX_UNIT_PX,48); priceView.setGravity(Gravity.CENTER); setLayout(); } public TextView getNameView(){ return nameView; } public TextView getEnCodeView(){ return enCodeView; } public TextView getPriceView(){ return priceView; } public PriceData getPriceData(){ return priceData; } private void setLayout(){ LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT,1); LinearLayout linearLayout = new LinearLayout(getContext()); linearLayout.setOrientation(VERTICAL); linearLayout.addView(nameView,p); linearLayout.addView(enCodeView,p); addView(linearLayout, p); p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT,1); linearLayout = new LinearLayout(getContext()); linearLayout.setOrientation(VERTICAL); linearLayout.addView(priceView,p); addView(linearLayout, p); } public void setItem(PriceData data){ priceData = data; } } private class PriceBoardAdapter extends BaseAdapter{ private Context _context; public PriceBoardAdapter(Context context){ _context = context; } public int getCount(){ return items.size(); } public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { PriceBoardItem view = getItemView(position); PriceData data = ((PriceBoardItem) items.get(position)).getPriceData(); view.getNameView().setText(data.getName()); view.getEnCodeView().setText(data.getEnCode()); view.getPriceView().setText(String.valueOf(data.getPrice())); convertView = view; return convertView; } } 調用:
PriceBoard priceBoard = new PriceBoard(context,null); priceData = new PriceData(); priceData.setName("現貨白銀"); priceData.setEnCode("Ag"); priceData.setPrice(4006); priceBoard.add(priceData); priceData = new PriceData(); priceData.setName("現貨銅"); priceData.setEnCode("Cu"); priceData.setPrice(43895); priceBoard.add(priceData); priceData = new PriceData(); priceData.setName("現貨鎳"); priceData.setEnCode("Ni"); priceData.setPrice(43895); priceBoard.add(priceData); addView(priceBoard); 效果:

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答