Android ListView填充数据的方法

作者:bdmh 时间:2022-12-22 06:33:28 

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);

效果:

Android ListView填充数据的方法

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

来源:http://blog.csdn.net/bdmh/article/details/38397851

标签:Android,ListView
0
投稿

猜你喜欢

  • Android实现双击返回键退出应用实现方法详解

    2023-03-23 21:33:29
  • java二维数组实现推箱子小游戏

    2022-08-31 10:18:40
  • VS2019打包WPF安装程序最新教程(图文详解)

    2021-11-18 15:52:08
  • spring boot 静态资源处理方法

    2022-07-14 22:12:42
  • C#通过rabbitmq实现定时任务(延时队列)

    2021-11-02 23:11:17
  • Android仿XListView支持下拉刷新和上划加载更多的自定义RecyclerView

    2023-04-26 12:46:02
  • C#文件路径操作详细总结

    2021-06-06 04:07:41
  • Mybatis关于动态排序 #{} ${}问题

    2023-09-01 17:34:57
  • Android中系统自带锁WalkLock与KeyguardLock用法实例详解

    2023-11-26 01:50:49
  • c#遍历System.drawing.Color下面的所有颜色以及名称以查看

    2022-05-12 06:33:19
  • Java JVM字节码指令集总结整理与介绍

    2021-09-18 17:10:20
  • SpringBoot在IDEA中实现热部署的步骤

    2022-01-14 23:30:02
  • 浅谈Android Studio 4.1 更新内容

    2021-09-17 11:27:30
  • Java时间工具类Date的常用处理方法

    2022-11-08 02:37:49
  • Java中String类的常用方法总结

    2021-11-26 10:39:20
  • 基于springboot实现redis分布式锁的方法

    2023-06-16 01:36:56
  • android 中 SQLiteOpenHelper的封装使用详解

    2022-11-09 12:36:57
  • C#中文随机数实现方法

    2023-12-07 20:56:30
  • Java设计模式之代理模式(Proxy模式)介绍

    2023-04-27 16:01:34
  • 聊聊Spring——AOP详解(AOP概览)

    2023-11-01 04:44:18
  • asp之家 软件编程 m.aspxhome.com