android开发中最常用的控件之一就是listview,伴随listview还要有adapter和放入适配器的item.然后假设其中有一部分item的生成符合一定规律,Item item = new Item(jsonObject);那么就该考虑下用反射来生成这些元素了.

首先是item的代码

  1. public class TestItem {
  2. public int id;
  3. public String image;
  4.  
  5. public TestItem(JSONObject json) {
  6. try {
  7. id = json.getInt("id");
  8. } catch (JSONException e1) {
  9. e1.printStackTrace();
  10. }
  11. try {
  12. image = json.getString("image");
  13. } catch (JSONException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17.  
  18. }

然后是生成一个item对象的代码

  1. Object object = TestItem.class.getConstructors()[0].newInstance(json);

放入adapter之后就是

  1. /**
  2. * 适配器的抽象类
  3. *
  4. * @author oldfeel
  5. */
  6. public abstract class BaseBaseAdapter extends BaseAdapter {
  7. private List<Object> list = new LinkedList<Object>();
  8. /** 适配器中元素的类 */
  9. private Class<?> classItem;
  10.  
  11. /**
  12. *
  13. * @param context
  14. * @param classItem
  15. * 适配器中元素的类
  16. */
  17. public BaseBaseAdapter(Class<?> classItem) {
  18. this.classItem = classItem;
  19. }
  20.  
  21. /**
  22. * 预处理清除列表数据和获取jsonarray
  23. *
  24. * @param page
  25. * 页码
  26. * @param json
  27. * json对象
  28. * @throws JSONException
  29. */
  30. public void putJSON(JSONObject json, int page) {
  31. if (page == 1) {
  32. list.clear();
  33. }
  34. try {
  35. JSONArray array = json.getJSONArray("adimage");
  36. for (int i = 0; i < array.length(); i++) {
  37. try {
  38. Object object = classItem.getConstructors()[0]
  39. .newInstance(array.getJSONObject(i));
  40. addItem(object);
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. } catch (JSONException e1) {
  46. e1.printStackTrace();
  47. }
  48. }
  49.  
  50. /**
  51. * 清除list
  52. */
  53. public void clear() {
  54. list.clear();
  55. notifyDataSetChanged();
  56. }
  57.  
  58. /**
  59. * 添加元素
  60. *
  61. * @param object
  62. */
  63. public void addItem(Object object) {
  64. list.add(object);
  65. notifyDataSetChanged();
  66. }
  67.  
  68. @Override
  69. public int getCount() {
  70. return list.size();
  71. }
  72.  
  73. @Override
  74. public Object getItem(int position) {
  75. if (position > list.size() - 1) {
  76. return null;
  77. }
  78. return list.get(position);
  79. }
  80.  
  81. @Override
  82. public long getItemId(int position) {
  83. return position;
  84. }
  85.  
  86. @Override
  87. public View getView(int position, View convertView, ViewGroup parent) {
  88. return getExView(position, convertView, parent);
  89. }
  90.  
  91. public abstract View getExView(int position, View convertView,
  92. ViewGroup parent);
  93.  
  94. }

在使用adapter的时候继承BaseBaseAdapter并输入item的类和布局文件就可以了

例如

  1. BaseBaseAdapter adapter = new BaseBaseAdapter(
  2. TestItem.class) {
  3.  
  4. @Override
  5. public View getExView(int position, View convertView,
  6. ViewGroup parent) {
  7. TestItem item = (TestItem) getItem(position);
  8. TextView textView = new TextView(MainActivity.this);
  9. textView.setText(item.image);
  10. return textView;
  11. }
  12. };

android开发在adapter中使用反射添加元素的更多相关文章

  1. [原]Android开发优化-Adapter优化

    ListView作为Android开发中使用频率最高的一个控件,保证ListView的流畅运行,对用户体验的提高至关重要.Adapter是ListView和数据源之间的中间人,当每条数据进入可见区时, ...

  2. Android开发——异步任务中Activity销毁时的问题

    0.  前言 在Android开发中经常会发生Activity的销毁重建,比如用户长时间接听一个电话后回到APP.在Android开发--Fragment知识整理(二)中我们提到了使用Fragment ...

  3. Android开发:Eclipse中SqliteManager插件使用

    通常开发Android的时候要使用到数据库操作,会遇到下面小问题: 数据库文件在哪?怎样訪问或操作? 能够通过:打开DDMS->File Explorer看到的sqlite数据库在eclipse ...

  4. Android开发-解决 AIDL 中找不到couldn't find import for class错误

    最近在使用AIDL做IPC的时候,在处理复杂的数据类型的时候,编译器总是报couldn't find import for class错误,所以在这里总结下AIDL使用的时候的一些注意事项,希望对你能 ...

  5. Android开发 解决AlertDialog中的EditText无法调出输入法的问题

    在AlertDialog中使用自定义的View,如果View中有EditText,在上面点击,默认是跳不出软键盘的,不是焦点的问题.解决方法,有两种,一是把AlertDialog换成Dialog,但这 ...

  6. Android开发(24)---安卓中实现多线程下载(带进度条和百分比)

    当我们学完java中多线程的下载后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java package com.example.downloads; import ...

  7. android开发(41) Fragment中使用POP_BACK_STACK_INCLUSIVE达到一次跳转到栈底。类似Activity的 采用FLAG_ACTIVITY_CLEAR_TOP

    需求场景: 在开发中遇到下面这样场景: 1.创建 Fragment A 显示.  这时栈的结构是: .Fragment A 2.创建 Fragment B 并 显示.  从下到上看,这时栈的结构是: ...

  8. Android 开发权限设置中英对照说明详解

    android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改上传( Al ...

  9. Android开发 获取视频中的信息(例如预览图或视频时长) MediaMetadataRetriever媒体元数据检索器

    前言 在Android里获取视频的信息主要依靠MediaMetadataRetriever实现 获取最佳视频预览图 所谓的最佳就是MediaMetadataRetriever自己计算的 /** * 获 ...

随机推荐

  1. 【Java学习笔记】函数使用

    package aaa; public class aaa { public static int add(int a,int b) { return a+b; } public static voi ...

  2. 【C#学习笔记】类构造函数使用

    using System; namespace ConsoleApplication { class stu { private string name; private int age; publi ...

  3. 使用源代码安装lnmp

    一.安装nginx前,安装pcre. # tar zxvf pcre-8.12.tar.gz# ./configure# make# make install 二.安装nginx # tar zxvf ...

  4. Tomcat 调优总结

    一. jvm参数调优 常见的生产环境tomcat启动脚本里常见如下的参数,我们依次来解释各个参数意义. export JAVA_OPTS="-server -Xms1400M -Xmx140 ...

  5. Java-泛型编程-使用通配符? extends 和 ? super

    原文地址:http://blog.csdn.net/fw0124/article/details/42296283 泛型中使用通配符有两种形式:子类型限定<? extends xxx>和超 ...

  6. 使用solrj操作solr索引库

    (solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有 ...

  7. Oracle的OracleBulkCopy不支持事务处理

    在进行OracleBulkCopy批量数据导入的过程中使用事务后抛出了异常, 没使用事务时可以正确批量导入, ORA-12154:无法解析指定的连接字符串, 但是TNS配置肯定是没有错的, 难道是Co ...

  8. 数据仓库之ETL漫谈

    ETL,Extraction-Transformation-Loading的缩写,中文名称为数据抽取.转换和加载. 大多数据仓库的数据架构可以概括为: 数据源-->ODS(操作型数据存储)--& ...

  9. 【剑指offer 面试题21】包含min函数的栈

    思路: 通过增加一个辅助栈保存每个状态对应的最小值.栈实现的不完整,应该还包含empty()等常规函数. #include <iostream> #include <stack> ...

  10. <转>配置DNS辅助服务器:DNS系列之四

    配置DNS辅助服务器   在前面的博文中,我们介绍了如何在DNS服务器中创建常用的DNS记录,本文中我们要为大家介绍如何配置DNS的辅助服务器,同时也要介绍一下和辅助区域类似的存根区域. DNS辅助服 ...