Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:ArrayAdapter<T>, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.我猜想这些Adapter的区别在于你的数据来源不一样:比如若你的数据来源于一个Arraylist 就使用BaseAdapter,SimpleAdapter,而数据来源于通过查询数据库获得Cursor那就使用SimpleCursorAdapter等。就目前我经常使用的BaseAdapter和SimpleCursorAdapter。
1,BaseAdapter:---数据来源于Arraylist-->MyArraylist
当你继承BaseAdapter客制化你的Adapter时,你必须OverWrite以下函数:
@Override
public int getCount() {
// TODO Auto-generated method stub
System.out.println("the size is\t" + MyArraylist.size());
return MyArraylist.size();
}
getCount返回的就是你的有多少条数据需要绑定的,也就是需要多少个View.比如这里返回的就是MyArraylist的Size.
public View getView(int position, View v, ViewGroup parent) {
// TODO Auto-generated method stub
View view;
if (v == null) {
view = mInflater.inflate(R.layout.track_list_item, null);
} else {
view = v;
}}
通过getView就获得了view来显示数据了。在这里你就可以自定义你的View了,但你通过XML定义可以通过LayoutInflater来inflater你的XML。getView里面就可以将MyArraylist的数据通过position 这个来将数据一条绑定一个View了。
2,SimpleCursorAdapter:---数据来源于数据库--->MyCursor
转自:http://blog.csdn.net/wong_judy/archive/2010/04/09/5466583.aspx
要实现bindView()和newView()这两个抽象方法需要实现的内容。
public void bindView(View view, Context context, Cursor cursor),重用一个已有的view,使其显示当前cursor所指向的数据。
public View newView(Context context, Cursor cursor, ViewGroup parent),为cursor所指向的数据新建一个View对象,并显示其数据。
通俗的说:比如你一个listview在一个屏幕里一次只能显示8条数据,那么第一次显示的时候就会newView 8次生成8个View,调用bindView绑定8条数据,而你有16条数据,但你拖动滚动条看9-16条时,此时不会再调用newView了,而只能调用了bindView去绑定新的数据而了。这样就省了空间了。
注意:传入到CursorAdapter中的Cursor结果集必须包含有列名为_id的列,否则SimpleCursorAdapter将不会起作用。
对于SimpleCursorAdapter中的newView与bindView的作用在BaseAdapter中的getView中也有这样的意义:getView里面我们必须做判断才能达到这种效果,就是要判断第二个参数View的是否为空:当空时就Infalte新的View,但不为空时就要就用它,这样就第一屏幕Infate 8个View,后面就直接使用这个8个view了。
注意:getView中是返回一个view,必须返回的是你infalte之后不为空的View,不然会报空指针异常。
==================================================================
关于ListView选中时显示的效果。
方法一:
通过给listview设置 android:listSelector这个属性,就可以对其下的所有item设定state_focused 时的背景变化
方法二:
实际上很简单,就是点击一下改变listviewitem的背景
public void changeBg(int position){
isFocused[whichClick==-1?0:whichClick] = false;
whichClick = position;
isFocused[position] = true;
notifyDataSetChanged();
}
转载自:
http://www.eoeandroid.com/thread-52160-1-1.html
package com.ui.demo;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MyArrayAdapter extends BaseAdapter{
private static List<Map<String,String>> list;
private LayoutInflater mInflater;
private ViewHolder holder;
//alertdialog 被选中初始化false
private static boolean[] isFocused ;
private static int whichClick = -1;
Context mContext;
public MyArrayAdapter(Context context,List<Map<String,String>> objects){
list = objects;
mContext = context;
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
isFocused = new boolean[objects.size()];
for(int i=0;i<objects.size();i++){
isFocused[i] = false;
}
}
public int getCount() {
return list.size();
}
public Object getItem(int position) {
return list.get(position);
}
public long getItemId(int position) {
return position;
}
public void changeBg(int position){
isFocused[whichClick==-1?0:whichClick] = false;
whichClick = position;
isFocused[position] = true;
notifyDataSetChanged();
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.musiccategories, null);
holder = new ViewHolder();
holder.s_Name = (TextView) convertView.findViewById(R.id.s_name);
holder.btnTest = (Button) convertView.findViewById(R.id.btnTest);
holder.btnTest.setText("Kaden");
holder.btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Button clicked.", Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}
convertView.setBackgroundResource(isFocused[position]?R.drawable.btn_down_bg:R.drawable.btn_up_bg);
//holder.s_Name.setText(list.get(position).get(WebTools.SON_GEMING));
return convertView;
}
static class ViewHolder {
TextView s_Name;
Button btnTest;
}
}
package com.ui.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
/**
* @Title: ListviewTest.java
* @Package com.ui.demo
* @Description: TODO
* @author Kaden Kang E-mail:cumtkangyi@gmail.com
* @version Create date: 2010-11-29下午12:10:13
* @version V1.0
*/
public class ListviewTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.my_listview);
List<Map<String, String>> listItem = new ArrayList<Map<String, String>>();
Map<String, String> map;
map = new HashMap<String, String>();
map.put("ItemTitle", "China");
map.put("ItemInfo", "+86");
listItem.add(map);
map = new HashMap<String, String>();
map.put("ItemTitle", "Iran");
map.put("ItemInfo", "+98");
listItem.add(map);
map = new HashMap<String, String>();
map.put("ItemTitle", "Iraq");
map.put("ItemInfo", "+964");
listItem.add(map);
map = new HashMap<String, String>();
map.put("ItemTitle", "Ireland");
map.put("ItemInfo", "+353");
listItem.add(map);
map = new HashMap<String, String>();
map.put("ItemTitle", "Israel");
map.put("ItemInfo", "+972");
listItem.add(map);
map = new HashMap<String, String>();
map.put("ItemTitle", "American");
map.put("ItemInfo", "+001");
listItem.add(map);
ListView listView = (ListView)findViewById(R.id.mListView);
final MyArrayAdapter adapter = new MyArrayAdapter(this, listItem);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
adapter.changeBg(arg2);
}
});
}
}
分享到:
相关推荐
要改变ListView选中行的字体颜色和图片,我们需要理解ListView的工作原理,以及如何自定义其Adapter和视图。以下是一些关键知识点的详细介绍: 1. **ListView的基本使用**: - ListView是一个视图容器,它能加载...
4. **处理侧滑事件**:在识别到侧滑手势后,可以对ListView的当前选中项执行相应的操作,例如显示删除按钮或者直接执行删除操作。这个过程通常需要配合Adapter来完成,因为Adapter是连接ListView和数据源的桥梁。 5...
为了实现选中效果,我们可以自定义一个监听器,监听ListView的点击事件。这可以通过实现`OnItemClickListener`接口来完成: ```java listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @...
此外,还可以通过监听ListView的OnItemClickListener和OnItemSelectedListener事件,动态改变选中项的状态。例如,当项被点击时,可以通过`setItemChecked()`方法来设置选中状态,并更新对应的背景。 总之,自定义...
ListView的默认行为是不设置任何项为选中状态,但有时我们希望在应用启动时,第一个Item能自动呈现出选中效果,以引导用户或者突出初始焦点。本教程将深入讲解如何实现ListView的第一个Item的默认选中状态。 首先,...
- 从文件名推断,这可能是一个关于进度条显示的示例,可能与EditText和ListView的交互有关,比如在用户输入时显示加载进度,或者处理网络请求等。 综上所述,解决Android ListView中多个EditText显示混乱的问题...
本篇文章将详细探讨如何实现Android ListView item的选中高亮显示。 1. **自定义Adapter** 首先,你需要创建一个自定义的Adapter来填充ListView。Adapter是连接数据源和ListView的桥梁,通过它,我们可以将数据...
本教程将深入讲解如何监听ListView的上下滑动事件,并实现下拉刷新、上拉加载以及一键置顶的功能。 首先,我们要理解ListView的工作原理。ListView通过复用视图(ViewHolder模式)来提高性能,当用户滚动时,不再...
3. 协调滚动:为了保持联动效果,可能需要监听两个ListView的滚动事件,当一个ListView滚动时,同步调整另一个ListView的位置,确保展示的内容与用户选择的层级对应。 三、联动实现方式 1. 通过接口:定义一个接口...
4. 设置ListView的OnItemClickListener,监听单击事件,当用户点击某一行时,获取选中行的数据,创建ClipData并调用ClipboardManager的setPrimaryClip()方法。 5. 为ListView注册长按事件,通过Override `...
当我们需要在用户点击ListView的某一项时,让它有明显的视觉反馈,即“选中高亮显示”,这就需要用到ListView的选中状态处理。下面我们将详细探讨如何实现这一功能。 首先,我们需要理解ListView的工作原理。...
在Android开发中,ListView是常用的数据展示控件,它可以有效地展示大量数据并实现滚动效果。然而,当ListView内部嵌套CheckBox等可交互组件时,常常会遇到一些问题,特别是滑动过程中选中状态错乱的现象。这个问题...
总之,要在Android中实现ListView的单选功能,关键在于创建一个带有选中状态的数据模型,自定义适配器以显示选中状态,以及设置点击事件来更新选中状态。在实际开发中,你可能还需要考虑其他因素,如动画效果、多...
以上就是实现ListView选中效果保留的一些常见方法。实际开发中,可能会结合使用多种技术来优化用户体验。记得在处理ListView时,考虑到性能问题,避免在getView()方法中执行昂贵的操作,如网络请求或数据库查询。...
2. 在Adapter的getView方法中,根据position判断当前RadioButton是否应该被选中,避免因ListView的复用导致的显示问题。 3. 考虑使用RadioGroup包裹每个ListView项的RadioButton,这样可以自动处理单选逻辑,但可能...
同时,它需要监听ListView的滚动事件,以便在用户滚动时保持列头的位置不变。 2. **列头布局**: 列头可以是一个自定义的布局,包含多个TextView或其他视图,用于显示列名。布局可以通过XML文件定义,也可以在代码...
默认情况下,ListView在选中某项时会自动高亮显示。你可以通过设置`android:listSelector`属性来定制选中状态下的背景颜色或图片。例如,在XML布局文件中,可以在ListView标签内添加以下代码: ```xml <ListView...
"ListView选中item颜色改变"是常见的需求,它涉及到ListView的交互设计,使得用户可以通过视觉反馈感知到所选中的条目。本篇文章将深入探讨如何实现这个功能。 首先,我们需要了解ListView的基本工作原理。ListView...
本示例"Android中ListView结合CheckBox获取选中项.rar"旨在教授如何在ListView中集成CheckBox,并有效地获取用户选择的数据。 1. **ListView基本使用** - ListView是一个可以滚动的视图,它能显示一行行的数据。...
在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据的列表,通常用于实现滚动效果。本示例将深入探讨如何在Android应用中使用ListView,包括它的基本使用、适配器(Adapter)机制以及一些高级特性...