`
zhenzxie
  • 浏览: 68186 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android自定义Adapter--继承于SimpleAdapter

阅读更多
      今天晚上做一个依据数组中元素是否为null,来设置textView的可见性,本来想用简单的用setVisibility来实现,结果好像没有什么效果,后来去看SimpleAdapter的getView()原理,发现可以bindView方法中实现这一功能,于是有了下面RemindViewAdapter类,代码基本是在SimpleAdapter中摘抄出来的。
    /**
	 * 用于RemindView里数据绑定的Adapter
	 * 
	 * @author xzz
	 * 
	 */
	public class RemindViewAdapter extends SimpleAdapter {

		/**
		 * 保存map的list,map保存数据
		 */
		private List<? extends Map<String, ?>> mData;

		/**
		 * 解析的xml资源文件id
		 */
		private int mResource;

		/**
		 * RemindViewAdapter所需的key数组
		 */
		private String[] mFrom;

		/**
		 * RemindViewAdapter所需的id数组
		 */
		private int[] mTo;

		/**
		 * 解析器
		 */
		private LayoutInflater mInflater;

		/**
		 * 有更新的内容的数量,没有更新的位置置null,
		 */
		private String[] mNewTextItem;

		/**
		 * 属兔绑定
		 */
		private ViewBinder mViewBinder;

		/**
		 * 构造方法,对实例域进行引用复制
		 * 
		 * @param context
		 * @param data
		 * @param resource
		 * @param from
		 * @param to
		 * @param newTextItem
		 * @see android.widget.SimpleAdapter
		 */
		public RemindViewAdapter(Context context,
		        List<? extends Map<String, ?>> data, int resource,
		        String[] from, int[] to, String[] newTextItem) {

			super(context, data, resource, from, to);
			mData = data;
			mResource = resource;
			mFrom = from;
			mTo = to;
			mNewTextItem = newTextItem;
			mInflater = (LayoutInflater) context
			        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		/**
		 * @see android.widget.Adapter#getCount()
		 */
		public int getCount() {

			return mData.size();
		}

		/**
		 * @see android.widget.Adapter#getItem(int)
		 */
		public Object getItem(int position) {

			return mData.get(position);
		}

		/**
		 * @see android.widget.Adapter#getItemId(int)
		 */
		public long getItemId(int position) {

			return position;
		}

		/**
		 * @see android.widget.Adapter#getView(int, View, ViewGroup)
		 */
		public View getView(int position, View convertView, ViewGroup parent) {

			return createViewFromResource(position, convertView, parent,
			        mResource);
		}

		/**
		 * 
		 * 从资源文件中创建View
		 * 
		 * @param position
		 *            位置
		 * @param convertView
		 * @param parent
		 * @param resource
		 * @return
		 * @see android.widget.SimpleAdapter#createViewFromResource
		 */
		private View createViewFromResource(int position, View convertView,
		        ViewGroup parent, int resource) {

			View v;
			if (convertView == null) {
				v = mInflater.inflate(resource, parent, false);
			} else {
				v = convertView;
			}

			bindView(position, v);

			return v;
		}

		/**
		 * 主要是依据newItemText数组中是否为null,来设置R.id.newtextitem的可视性
		 * 
		 * @param position 位置
		 * @param view listView中item的View
		 * @see android.widget.SimpleAdapter#bindView
		 */
		private void bindView(int position, View view) {

			final Map<String, ?> dataSet = mData.get(position);
			if (dataSet == null) {
				return;
			}
			final ViewBinder binder = mViewBinder;
			final String[] from = mFrom;
			final int[] to = mTo;
			final int count = to.length;

			for (int i = 0; i < count; i++) {
				final View v = view.findViewById(to[i]);
				if (v != null) {
					final Object data = dataSet.get(from[i]);
					String text = data == null ? "" : data.toString();

					boolean bound = false;
					if (binder != null) {
						bound = binder.setViewValue(v, data, text);
					}

					if (!bound) {
						if (v instanceof TextView) {
							setViewText((TextView) v, text);
							if (from[i].equals(key[2])
							        && mNewTextItem[position] == null)
//在这里实现依据newItemText数组中是否为null,来设置R.id.newtextitem的可视性
//当然也可以在这个方法里实现自己定制的ListView中的Item
								v.setVisibility(View.INVISIBLE);
						} else if (v instanceof ImageView) {
							if (data instanceof Integer) {
								setViewImage((ImageView) v, (Integer) data);
							} else {
								setViewImage((ImageView) v, text);
							}
						} else {
							throw new IllegalStateException(
							        v.getClass().getName()
							                + " is not a "
							                + " view that can be bounds by this SimpleAdapter");
						}
					}
				}
			}
		}
	}
  • 大小: 13.4 KB
分享到:
评论

相关推荐

    5-ListView-SimpleAdapter及自定义Adapter-进阶2.rar

    综上所述,理解并熟练运用SimpleAdapter和自定义Adapter是Android开发中的重要技能。通过灵活运用这些知识,开发者可以创建出功能丰富、交互性强的列表视图,提升用户界面的体验。在实际项目中,可以根据具体需求...

    Android自定义Adapter适配器

    在Android中,最常见的Adapter实现有ArrayAdapter、SimpleAdapter和CursorAdapter,但有时这些内置的Adapter无法满足特定需求,这时就需要我们自定义Adapter。 自定义Adapter通常涉及以下几个步骤: 1. 创建一个...

    android-listView-SimpleAdapter-进阶1.rar

    7. **自定义适配器**:如果SimpleAdapter无法满足所有需求,可以考虑继承BaseAdapter来自定义更复杂的适配器。 总之,SimpleAdapter是Android开发中快速展示列表数据的一个好工具。通过熟练掌握其使用方法和进阶...

    ListView使用SimpleAdapter和自定义Adapter填充数据

    在Android开发中,ListView是一个非常常见的组件,用于展示大量数据的列表形式。在这个场景中,我们探讨了如何...在实际项目中,选择哪种方式取决于具体的需求和场景,但自定义Adapter通常能提供更丰富的定制化功能。

    Android之自定义Adapter的ListView

    接着,创建了一个名为`ListViewAdapter`的自定义Adapter,继承自`BaseAdapter`,并传入上下文和数据集作为构造函数参数。然后,通过`listView.setAdapter(listViewAdapter)`将Adapter绑定到ListView上。 在`getView...

    android SimpleAdapter 中添加按钮响应事件

    接下来,我们需要创建一个自定义的`ListAdapter` 类,继承自`SimpleAdapter`,并在`getView()` 方法中为按钮设置监听器。这里我们假设名为 `CustomSimpleAdapter`: ```java public class CustomSimpleAdapter ...

    安卓自定义下拉框---Spinner的实现

    自定义适配器通常需要继承BaseAdapter或CursorAdapter,重写其中的几个关键方法,如`getCount()`、`getItem()`、`getItemId()`以及`getView()`。 ```java public class CustomSpinnerAdapter extends ArrayAdapter...

    Android自定义Adapter的ListView的思路及代码

    总结起来,自定义Adapter是Android开发中实现ListView个性化和功能扩展的重要手段。通过自定义Adapter,开发者可以根据需求创建复杂的数据视图,并处理各种用户交互事件,从而提高应用的用户体验和功能多样性。

    listview 自定义adapter的例子demo

    示例中的"adapter"文件可能包含了实现以上步骤的代码,包括自定义Adapter类、数据模型类以及展示数据的布局文件。在实际开发中,你可能还需要处理点击事件、优化视图复用等高级功能。 总之,自定义ListView的...

    安卓listview相关相关-自定义listview继承最新控件.zip

    常见的Adapter有ArrayAdapter、SimpleAdapter等,但自定义Adapter可以提供更大的灵活性。 3. **继承Latest Control**:描述中提到的“继承最新控件”,可能是指开发者在自定义ListView时,利用了Android最新的UI...

    android 自定义ListView实现单选

    在这个自定义Adapter中,我们将维护一个记录当前选中项的变量,例如`int selectedPosition`。这个变量用于存储被选中的列表项位置。 ```java public class CustomListAdapter extends ArrayAdapter&lt;String&gt; { ...

    Android-ListView-Example

    9. **自定义Adapter和视图**:为了实现更复杂的UI和交互,开发者可能需要自定义Adapter和视图。这包括创建自定义的XML布局文件,以及在Adapter的`getView()`方法中对其进行实例化和配置。 10. **ListView与...

    Android listview与adapter用法

    5. **自定义Adapter** - 当系统提供的Adapter无法满足需求时,可以继承BaseAdapter并覆盖其方法,如`getView()`,来实现自定义的视图和行为。`getView()`方法是Adapter的核心,它决定了每个列表项如何被渲染。 6. ...

    自定义通用SimpleAdapter

    创建一个新的类,继承自`SimpleAdapter`。这个类需要重写`getView()`方法,这是适配器中决定每个列表项视图如何显示的关键方法。 ```java public class CustomSimpleAdapter extends SimpleAdapter { private ...

    Android 之 自定义适配器

    1. 创建一个新的Adapter类:这个类需要继承自Android提供的BaseAdapter或RecyclerView.Adapter。BaseAdapter适用于ListView、GridView等,而RecyclerView.Adapter适用于RecyclerView。 2. 实现必要的方法: - `...

    Android之Adapter用法总结

    5. **自定义Adapter** - 当系统提供的Adapter不能满足需求时,可以继承BaseAdapter并重写其方法,如`getView()`,`getCount()`,`getItem()`等,以实现自定义的视图展示和数据处理逻辑。 6. **Adapter优化** - ...

    安卓listview相关相关-ListView通过adapter传递对象.rar

    - 在Android中,通常我们会创建一个继承自BaseAdapter的自定义Adapter,然后在Adapter的`getView()`方法中根据数据创建或复用View。 - 数据通常存储在一个列表(如ArrayList)中,每个元素代表ListView的一行。...

    Android开发---适配器

    在Android开发过程中,适配器(Adapter)是一种非常重要的设计模式,它主要应用于数据与UI之间的桥梁搭建,使得视图能够灵活地展示来自不同数据源的数据。简单来说,适配器就像是一个中介者,将复杂的数据结构转换成...

Global site tag (gtag.js) - Google Analytics