Android ListView填充数据的方法

2020-10-22 11:35:40 浏览数 (1)

Android ListView填充数据的方法

因为多人开发,为了是自己开发的模块方便融合到主框架中,同时也为了减小apk的大小,要求尽可能少的使用xml的布局文件,开发中需要在ListView中显示数据,网上查到的几乎所有的示例,都是通过xml文件来为ListView的Item提供布局样式,甚是不方便。

能不能将自己通过代码创建的布局(如View,LinearLayout)等动态的布局到ListView呢?当然可以。

为了给ListView提供数据,我们需要为其设置一个适配,我们可以从BaseAdapter继承,然后重写它的getView方法,这个方法中有一个参数convertView,我们可以将它设置为我们自定义的视图并返回,来实现加载用代码定义好的布局。

定义一个LinearLayout布局,它是继承自View的,所以可以通过getView返回(注意:不要为这个布局使用 LinearLayout.LayoutParams 参数,因为ListView不识别,他识别的是AbsListView LayoutParams)

代码如下:

代码语言:javascript复制
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; 
} 
} 

调用:

代码语言:javascript复制
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); 

效果:

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

0 人点赞