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);
效果:
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
series(string $value,[ string $categories]) string $value $config = ['path' => './tests']; $fileObject = new \Vtiful\Kernel\Excel($config); $fileObject = $fileObject->fileName('tutorial.xlsx'); $
factory 辅助函数 必须 使用 factory 方法来做数据填充,因为是框架提倡的,并且可以同时为测试代码服务。 运行效率 开发数据填充时,必须 特别注意 php artisan db:seed 的运行效率,否则随着项目的代码量越来越大,db:seed 的运行时间会变得越来越长,有些项目多达几分钟甚至几十分钟。 原则是: Keep it lighting speed. 只有当 db:seed
问题内容: 我想模拟一个ResultSet。说真的 我正在重构一个大的复杂代码段,该代码段是从ResultSet中解析数据,并且我希望代码的行为相同。因此,我需要为要重构的部分编写一个单元测试,以便能够对此进行测试。 谷歌搜索后,我想出了两个想法: 使用EasyMock,编写looooong模拟序列。非常糟糕的解决方案:难以添加初始数据,难以更改数据,测试调试程序繁琐。 使用Apache Derb
简介 Laravel 可以用 seed 类轻松地为数据库填充测试数据。所有的 seed 类都存放在 database/seeds 目录下。你可以任意为 seed 类命名,但是更应该遵守类似 UsersTableSeeder 的命名规范。Laravel 默认定义的一个 DatabaseSeeder 类。可以在这个类中使用 call 方法来运行其它的 seed 类从而控制数据填充的顺序。 编写 See
问题内容: 我正在尝试使用来自Web服务的数据填充jqGrid。我已经仔细研究了jqGrid代码和文档。我需要另一双眼睛看下面的代码,并告诉我是否缺少某些内容。 正如您将在代码中看到的那样,我将网格设置为在页面加载时或刷新期间加载。加载网格后,我再次调用Ajax以获取JSON数据并显示在网格下方的div中。 我看到了大多数预期的行为。页面加载后,网格显示加载指示器,然后启动Ajax调用,并且JSO
问题内容: 我有一个带有表,组合框的框架,我想通过组合框用数据库中的数据填充表,但是如果我与itemlistener一起使用,我不会看到没有itemlistener的表,然后我会看到包含数据的表(combob = combobox) 问题答案: 您有几个问题: 您使用不正确。您的代码可能可以运行(我不确定),但是它没有利用的功能。 从ResultSet读取数据的代码没有意义,因为您甚至根本没有从R
我有一个带有table的框架,combobox,我想通过combobox用来自数据库的数据填充表,但是如果我使用itemlistener我看不到表,没有itemlistener和,我就看到了带有数据的表(combob=combobox)
问题内容: 我是PyQt的新手,正在努力填充QTableView控件。 我的代码如下: 实际上,在代码中,我成功地填充了QListView,但是未显示我设置为QTableView的值,您还可以看到我将行截断为10,因为它永远需要显示数据帧的数百行。 那么,从熊猫数据框中填充表模型的最快方法是什么? 提前致谢。 问题答案: 就我个人而言,我将创建自己的模型类以使其处理起来更加容易。 例如: