自定义Adapter中的EditText控件输入数据之后,怎么更新listview中edittext

15:40 提问
listview+edittext:如何监听edittext的修改完后的内容
listview中每个item里放一个edittext,adapter有使用对象的复用,请问如何监听到edittext中内容修改完成后,得到最后修改后的内容,再调用一个方法,然后进行其它处理
按赞数排序
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!
edittext绑定textchagnge的监听就行了
建议加上一个handle,在每次修改edittext之后发送handle信息
应该在adapter里加上textchagnge的监听Android_ListView_Adapter使用和数据动态加载 - 推酷
Android_ListView_Adapter使用和数据动态加载
1.ListView概述
:ListView是比较常用的控件,其存在的最根本的原因在于它的高效,ListView通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经常伴随着解析xml)。ListView的本质是一张bitmap(当然所有的控件文字等在屏幕上看到的最终都会变成bitmap),ListView会按照需求,根据Adapter提供的信息把需要的Item画出来显示在屏幕上,当屏幕滚动的时候会重新计算Item的位置并绘制出新的bitmap显示在屏幕上。这样听起来感觉可能不是很高效,但这样带的好处就是,每用为一第个Item&
创建一个View对象,样式一样的对象可以共用一个View对象,减少了内存的消耗。而且ListView是事件驱动的,只有当需要的时候才会重新绘制,并且只会&
绘制当前屏幕上所显示的Items.
2.ListView有关的三要素
(1).ListVeiw
用来展示列表的View,如果继承了ListActivity则使用getListView()得到listView对象
(2).Adapter
用来把数据映射到ListView上的中介,常用的有ArrayAdapter,SimpleAdapter,CursorAdapter和SimpleCursorAdapter.BaseAdapter
1).ArrayAdapter
构造函数objects接收一个集合或者数组,将会按照集合的元素(或者数组的子集)逐条在ListView列出,一个一行;
//ArrayAdapter Constructor
new ArrayAdapter(Context context, //The current context.
int resource,
The resource ID for a layout file containing a layout to use when instantiating views
例如:android.R.layout.simple_list_item_single_choice
List&T& objects)
//数据对象
2).CursorAdapter
Adapter that exposes data from a&Cursor to a&&ListView widget. The Cursor must include& a column named &_id& or this class will not work;
3).SimpleAdapter
有最好的扩充性,通过自定义xml样式文件,达到自定义的列表文件
//SimpleAdapter Constructor
SimpleAdapter (Context context, // 上下文
List&? extends Map&String, ?&& data,
* A List of Maps.每个list元素就是一列
* Map集合中的key集合,应该包含后面参数(from)中每个元素
int resource,
//为view layout定义的一列,其中应该包含后面参数(to)中每个元素
String[] from,
//从data引出的某些列名
//从resource对应的layout文件中,找到相应的id而组成的数组
4).SimpleCursorAdapter
可以理解为SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
5).BaseAdapter
* 自定义适配器,常见将Cursor或者其他的数据存储在一个集合中,效率提高!
private class MyAdapter extends BaseAdapter {
private List&String&
//为该适配器设置展现的数据,当我们为该适配器指定了新的数据后,应该调用notifyDataSetChanged()方法后才能完成数据的动态加载
public void setList( List&String& list){
this.list =
public int getCount() {
return list.size();
public Object getItem(int position) {
return list.get(position);
public long getItemId(int position) {
//重要方法,用于展现该listview的item条目
public View getView(int position, View convertView, ViewGroup parent) {
* convertView为一个item条目对象,每个item滑过之后,创建的item对象有被重新销毁,为此安卓提供一种机制,
* 创建的条目不被销毁而是供后来展现的item重复使用,大大提高了效率
TextView textView =
if (convertView == null) { //如果没有可供重复使用的item View对象
textView = new TextView(getActivity());
* 里面包含一种高效的处理机制,当每个item比较复杂,如果重复的执行类型转换、查找控件等操作,将会很大浪费,
* 可以定义一个类,专门用来存放控件对象的引用。后面的例子键会介绍到
textView = (TextView) convertV //如果已经加载将重复使用
textView.setText(list.get(position));
textView.setPadding(20, 20, 20, 20);
textView.setBackgroundColor(Color.GREEN);
return textV
(3).Data数据
List集合或者一个Cursor实例对象。但是如果查询数据库,将会很耗时,因此将使用loaderManager进行统一的管理,异步完成Cursor到数据集合的转化,可参考
3.ListView的id说明
(1).ListActivity子类
如果java类继承了ListActivity,那么表明该类只能存在一个ListView控件,可以通过getListView()方法取得默认的控件,但是在相应的xml文件中,定义的ListView必须指明固定的id,android:id=&@android:id/list&
(2).Activity子类
如果java类继承了Activity,那么id就没有特定的要求,xml支持自定义id
4.ListView的滚动事件
(1).AbsListView.OnScrollListener事件类型
SCROLL_STATE_IDLE
当前item处于空闲状态,没有发生滚动
SCROLL_STATE_TOUCH_SCROLL
item正在滚动,但是手指还停留在屏幕上
SCROLL_STATE_FLING
类似惯性,当前item正在滚动
&(2).OnScrollListener方法
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
//监听listView的状态是否改变
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//在滚动的过程中会触发该事件
(3).下拉刷新底部
listView.setOnScrollListener(new OnScrollListener() {
private boolean isBottom = //用于标记是否到达顶端
//listview的状态发送改变时执行
public void onScrollStateChanged(AbsListView view, int scrollState) {
System.out.println(&scrollState:&+scrollState);
if(isBottom && scrollState==OnScrollListener.SCROLL_STATE_IDLE){
System.out.println(&数据加载&);
//简单模拟数据加载过程
for(int j=0; j&10; j++){
Map&String, String& map = new HashMap&String, String&();
map.put(&id&, String.valueOf((i++)));
map.put(&name&, &newName=&+i);
map.put(&age&, String.valueOf(i));
adapter.getList().add(map);
adapter.notifyDataSetChanged();
isBottom =
//在滚动的过程中不断执行
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
System.out.println(firstVisibleItem+&:&+visibleItemCount+&:&+totalItemCount);
if(firstVisibleItem+visibleItemCount == totalItemCount){
isBottom =
isBottom =
5.ListView数据的动态刷新
ListView动态更新应用很广,比如执行添加或者删除后,数据的动态更新展现。为了达到这种目的,不得不提到适配器的notifyDataSetChanged()方法,有时可能读者在使用的过程中,会发现即便调用了该方法数据并没有实时的更新,先别急,后面将分析原因。
下面一个应用,在主Activity中EditText中添加一条数据,在其内部的ListFragment动态更新数据。
public class MainActivity extends Activity {
private FragmentM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager = getFragmentManager();
button = (Button) findViewById(R.id.confirm);
//将ListFragment添加进主Activity中,如果没有使用布局加载一个ListView对象
if (manager.findFragmentByTag(&right&) == null) {
manager.beginTransaction()
.replace(R.id.right, new RightFrag(), &right&)
.addToBackStack(&right&)
.commit(); //事务提交
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//使用内容提供者,添加数据
Uri uri = Uri.parse(&content://com.baidu.provider/music&);
ContentValues values = new ContentValues();
values.put(&name&, ((EditText) findViewById(R.id.name)).getText().toString());
Uri u = getContentResolver().insert(uri, values);
//判断数据是否添加成功
if (u != null) {
Toast.makeText(MainActivity.this, &添加成功!&, 1).show();
* 重启loader对象,完成数据的动态加载,
读者可能遇到一个问题,数据时重新加载了,但是listView的item重新回到了第一个item位置,
这是因为我们在重启的过程中,又为该listView设置了适配器,只要不重新设置,item的位置不会改变
getLoaderManager().restartLoader(
//该loaderManger管理下的Id为1的loader
//传递参数bundle,常为null
(RightFrag) (getFragmentManager().findFragmentByTag(&right&)));
//LoaderManager.LoaderCallbacks的回掉函数,由于该ListFragment实现了该接口
Toast.makeText(MainActivity.this, &添加失败&, 1).show();
public class RightFrag extends ListFragment implements LoaderCallbacks&Cursor& {
private LoaderM
private MyA
private List&String& //用于存放数据库数据,这里每个item只简单展现一条文本数据
//完成一些初始化操作
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
manager = getLoaderManager();
list = new ArrayList&String&();
adapter = new MyAdapter(); //创建自定义适配器
* 为该listView设置adapter,如果普通的listView使用setAdapter()方法
* 如果该方法在Cursor数据查询完成后设置,listView的将会查询回到第一个。
setListAdapter(adapter);
manager.initLoader(1, null, this); //初始化一个loader对象
/*完成layout布局文件的加载并返回,
* 该方法不用重写,由于ListFragment已经默认返回一个listView对象
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.list, null);
//使用内容提供者,返回loader对象
public Loader&Cursor& onCreateLoader(int id, Bundle args) {
Uri uri = Uri.parse(&content://com.baidu.provider/music&);
//CursorLoader是AsyncTaskLoader的子类,异步查询
return new CursorLoader(getActivity(), uri, new String[] { &name& },
null, null, null);
public void onLoadFinished(Loader&Cursor& loader, Cursor data) {
* 将list数据清空
* 如果数据量很大,这种操作就有问题,如果只有增加,我们就不要清空,
只需要记录上次查询的id,这次查询满足_id & id即可,提高效率
list.clear();
while (data.moveToNext()) {
list.add(data.getString(data.getColumnIndex(&name&)));
* 使用该方法应该注意,如果数据库的数据发送改变,listView不能动态更新,
只有适配器的对应的list数据发生了改变,调用该方法才能达到更新的效果
adapter.notifyDataSetChanged();
public void onLoaderReset(Loader&Cursor& loader) {
* 自定义适配器,常见将Cursor或者其他的数据存储在一个集合中,效率提高!
private class MyAdapter extends BaseAdapter {
public int getCount() {
return list.size();
public Object getItem(int position) {
return list.get(position);
public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) {
* convertView为一个item条目对象,每个item滑过之后,创建的item对象有被重新销毁,为此安卓提供一种机制,
* 创建的条目不被销毁而是供后来展现的item重复使用,大大提高了效率
View view =
if (convertView == null) { //如果没有可供重复使用的item View对象
view = getActivity().getLayoutInflater().inflate(R.layout.item, null);
//如果view的布局很复杂,可以将内部的控件保存下来
TextView textView = (TextView) view.findViewById(R.id.text);
ViewSet set = new ViewSet();
set.textView = textV
view.setTag(set);
view = convertV //如果已经加载将重复使用
//不用重复的查找控件
ViewSet views = (ViewSet) view.getTag();
views.textView.setText(list.get(position));
//保存item控件
static class ViewSet{
TextView textV
&6.简单适配器的使用
* ListViewTest.java
* @author Administrator
public class MainActivity extends ListActivity {
private ListView listV
private List&Map&String, String&&
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = this.getListView();//由于继承了ListActivity,可以直接得到listView控件,但是前提xml文件中需指定默认id
////////method1()
listView.setAdapter(new SimpleAdapter(MainActivity.this, resource,
R.layout.item, new String[] { &name&, &info& }, new int[] {
R.id.name,
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); //设定后才可选中
////////method2()
listView.setAdapter(new ArrayAdapter&String&(this,
android.R.layout.simple_list_item_single_choice, new String[] {
&河南&, &湖北&, &北京&, &上海&, &河南&, &湖北&, &北京&, &上海&, &河南&,
&湖北&, &北京&, &上海&, &河南&, &湖北&, &北京&, &上海& }));
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
public void get() {
resource = new ArrayList&Map&String, String&&();
Map&String, String& map1 = new HashMap&String, String&();
map1.put(&name&, &小李飞刀&);
map1.put(&info&, &good!&);
resource.add(map1);
Map&String, String& map2 = new HashMap&String, String&();
map2.put(&name&, &北京爱情故事&);
map2.put(&info&, &ok!&);
resource.add(map2);
Map&String, String& map3 = new HashMap&String, String&();
map3.put(&name&, &亮剑&);
map3.put(&info&, &22~~~~~~~~&);
resource.add(map3);
&!-- activity_main.xml --&
&LinearLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical& &
&LinearLayout android:orientation=&horizontal&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&&
&TextView android:layout_height=&wrap_content&
android:layout_width=&match_parent&
android:layout_weight=&1&
android:text=&@string/name&
android:layout_marginLeft=&3sp&/&
&TextView android:layout_height=&wrap_content&
android:layout_width=&match_parent&
android:layout_weight=&1&
android:text=&@string/age&
android:layout_marginLeft=&3sp&/&
&/LinearLayout&
&!-- 一定要注意ListView空间的id,详细说明要看本页说明 --&
android:id=&@android:id/list&
android:layout_width=&fill_parent&
android:layout_height=&match_parent&
&/LinearLayout&
&!-- item.xml --&
&LinearLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical& &
android:id=&@+id/name&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:textSize=&20sp&
android:layout_marginLeft=&3sp& /&
android:id=&@+id/info&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:textSize=&15sp&
android:layout_marginLeft=&10sp& /&
&/LinearLayout&
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致I am making a E-commerce app whose cart list has a custom ListView which consist of EditText. The EditText represents the quantity of item. I am using OnFocusChangeListener to detect when a customer is done changing the quantity of the item then updating the cart on server. Everything is working fine, just the onFocusChange is being called twice i.e. I am getting false twice.
viewHolder.etProductQuantity.setOnFocusChangeListener( new View.OnFocusChangeListener() {
public void onFocusChange(View view, boolean hasFocus) {
if(!hasFocus){
// Updating the ProductList class's object to set the new quantity
// Updating product quantity on server
Log.d("Product Quantity", viewHolder.etProductQuantity.getText().toString() + b);
Thus, the coding is being executed twice which is creating problem.
解决方案 Adding the following line into your activity in the manifest fixed the problem:
android:windowSoftInputMode="adjustPan"
Not sure why though.
本文地址: &
我想提出一个电子商务应用程序,其车列表中有一个自定义的ListView 这是由的EditText 的。项目的的EditText 重新presents的数量。我使用 OnFocusChangeListener 当客户完成改变,然后更新服务器上的车项目的数量来检测。一切正常,只是 onFocusChange 被调用两次即我越来越假的两倍。
viewHolder.etProductQuantity.setOnFocusChangeListener(新View.OnFocusChangeListener(){
公共无效onFocusChange(查看视图,布尔hasFocus){
如果(!hasFocus){
//更新产品列表类的对象来设置新的量
//服务器更新的产品质量
Log.d(“产品数量”,viewHolder.etProductQuantity.getText()的toString()+ B);
}}); 因此,正在执行的编码两次被创建问题解决方案 添加下面一行到你的活动清单解决了这一问题: 的android:windowSoftInputMode =“adjustPan” 不知道为什么,虽然。
本文地址: &
扫一扫关注官方微信1.布局的XML文件里面添加EditText控件(省略)控件id=mSearch ListView的id=admin_
2.一、获取ListView展示的数据(通过适配器获取)
&二、这个是我要说的搜索功能& &&
mSearch.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
public void onTextChanged(CharSequence s, int start, int before, int count) {          //这个和之前的适配器不同,是搜索完成后listview
madminAdapter = new AdminManagerAdapter(AdminActivity.this, adminList);
//搜索完获取的数据
madminAdapter.setDataSource(adminList);
admin_lv.setAdapter(madminAdapter);
madminAdapter.getFilter().filter(s);
if (s.length() & 0) {
admin_lv.setVisibility(View.VISIBLE);
admin_lv.setVisibility(View.GONE);
public void afterTextChanged(Editable s) {
}});3.搜索适配的要实现:Filterable这个接口
代码如下:(其他适配的方法和之前的BaseAdapter是一样的)
//满足过滤条件的数据private List&AdminMenager& mOriginalV//过滤时候的总数据 这个是不变的数据private List&AdminMenager& adminL//适配器的adpaterprivate List&AdminMenager& adapterL//初始化数据public AdminManagerAdapter(Context context,List&AdminMenager& adminList) {
super(context);
this.adminList=adminL
mOriginalValues=new ArrayList&&();
adapterList=new ArrayList&&();      
adapterList.addAll(adminList);}
@Overridepublic Filter getFilter() {
if (myFilter==null){
myFilter=new MyFilter();
return myF}//过滤数据class MyFilter extends Filter {
//执行过滤
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0) {
mOriginalValues.clear();
results.values = adminL
mOriginalValues.clear();
for (Iterator&AdminMenager& iterator = adminList.iterator(); iterator
.hasNext();) {
AdminMenager name = iterator.next();
if (name.user_name.contains(constraint)) {
mOriginalValues.add(name);
results.values = mOriginalV
Log.d("adapter","???result"+results);
//得到过滤结果
protected void publishResults(CharSequence constraint, FilterResults results) {
adapterList = (ArrayList&AdminMenager&) results.
if (results.count & 0) {
notifyDataSetChanged();
notifyDataSetInvalidated();
}}注:此方法只用于搜索ListView展示的信息祝大家好运连连
阅读(...) 评论()小试牛刀---自定义listView及其adapter动态刷新
本文主要探讨自定义的adapter及其notifyDataSetChanged()方法的使用(无listView的监听部分):
先上图看下效果:(整个操作过程中,当前Activity未被pause或者stop, 豌豆荚截的图真大....无语)
&1,初始化状态,共20个dataItem
2, 15秒后向下滑动,增加了一个text100的item:
3,点击添加后,向下滑动,增加了一个text200的item(每点一次添加按钮就会增加一个text200的item):
4,点击删除按钮,上下滑动(每点一次,listView中的item就减少一个):
代码部分未贴完整,有简要注释,未考虑优化
adapter.xml:
&&&&&&& android:id=&@+id/listview1&
&&&&&&& android:layout_width=&fill_parent&
&&&&&&& android:layout_height=&0dp&
&&&&&&& android:layout_weight=&1&
&&&&&&& android:cacheColorHint=&#& /&
&&& &LinearLayout
&&&&&&& android:layout_width=&fill_parent&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:orientation=&horizontal&
&&&&&&& &Button
&&&&&&&&&&& android:id=&@+id/button_add&
&&&&&&&&&&& android:layout_width=&0dp&
&&&&&&&&&&& android:layout_height=&wrap_content&
&&&&&&&&&&& android:layout_weight=&1&
&&&&&&&&&&& android:text=&添加& &
&&&&&&& &/Button&
&&&&&&& &Button
&&&&&&&&&&& android:id=&@+id/button_delete&
&&&&&&&&&&& android:layout_width=&0dp&
&&&&&&&&&&& android:layout_height=&wrap_content&
&&&&&&&&&&& android:layout_weight=&1&
&&&&&&&&&&& android:text=&删除& &
&&&&&&& &/Button&
&&& &/LinearLayout&
&ListView/&标签中属性android:layout_height=&0dp&和android:layout_weight=&1&保证了平台在布局时会先计算其他元素(linearLayout)的宽高,再计算当前listView的宽高等属性,因android:layout_weight=&XXX&默认值为0, 1的优先级要比0低(如果整个xml是RelativeLayout布局,就easy了,有直接的属性可以设置)
两个&Button/&标签中的属性android:layout_weight=&1&和android:layout_width=&0dp&,使得他们的父元素在布局时,为他们平均分配空间,如果在其中一个&Button/&设置了间隔,如android:layout_marginLeft = &xxxdp&,那么父元素会先减去此间隔xxxdp,剩下空间依旧平均分配给两个button按钮
adapter_item.xml:
&&&&&&& android:id=&@+id/textview1&
&&&&&&& android:layout_width=&wrap_content&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:textColor=&#FF0000&
&&&&&&& android:textSize=&25dp& /&
&&& &Button
&&&&&&& android:id=&@+id/button1&
&&&&&&& android:layout_width=&wrap_content&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:layout_marginLeft=&150dp&
&&&&&&& android:focusable=&false& /&
Activity类AdapterActivity:
public class AdapterActivity extends Activity {
&&& private ListView listV
&&& private List&HashMap&String, String&&
&&& private ListViewA
&&& @Override
&&& protected void onCreate(Bundle savedInstanceState) {
&&&&&&& super.onCreate(savedInstanceState);
&&&&&&& setContentView(R.layout.adapter);
&&&&&&& listView = (ListView) findViewById(R.id.listview1);
&&&&&&& Button addButton = (Button) findViewById(R.id.button_add);
&&&&&&& Button deleteButton = (Button) findViewById(R.id.button_delete);
&&&&&&& ButtonListener listener = new ButtonListener();
&&&&&&& addButton.setOnClickListener(listener);
&&&&&&& deleteButton.setOnClickListener(listener);
&&&&&&& this.initListView();
&&&&&&& Timer timer = new Timer();
&&&&&&& timer.schedule(new TimerTask() {// 15秒后向data集合中增加一条数据
&&&&&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&&&&&& public void run() {
&&&&&&&&&&&&&&&&&&&&&&& HashMap&String, String& map = new HashMap&String, String&();
&&&&&&&&&&&&&&&&&&&&&&& map.put(&text&, &text100&);
&&&&&&&&&&&&&&&&&&&&&&& map.put(&buttonText&, &buttonText100&);
&&&&&&&&&&&&&&&&&&&&&&& data.add(map);
&&&&&&&&&&&&&&&&&&&&&&& Log.i(Constant.TAG, &添加数据成功&);
&&&&&&&&&&&&&&&&&&&&&&& // adapter.notifyDataSetChanged(); 非UI线程报错
&&&&&&&&&&&&&&&&&&&&&&& Message msg = new Message();
&&&&&&&&&&&&&&&&&&&&&&& msg.what = 1;
&&&&&&&&&&&&&&&&&&&&&&& handler.sendMessage(msg);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }, 15000);
&&& private Handler handler = new Handler() {
&&&&&&& @Override
&&&&&&& public void handleMessage(Message msg) {
&&&&&&&&&&& // super.handleMessage(msg);
&&&&&&&&&&& switch (msg.what) {
&&&&&&&&&&& case 1:
&&&&&&&&&&&&&&& // UI线程中调用此方法通知观察者(中关于adapter存在一个observer,未深究!)adapter数据已改变,刷新view
&&&&&&&&&&&&&&& adapter.notifyDataSetChanged();
&&&&&&&&&&&&&&& // adapter.notifyDataSetInvalidated();// 与上面
&&&&&&&&&&&&&&& // 效果相同,源码中除了注释不同,执行的代码一样,同样未深究
&&&&&&&&&&&&&&& // listView.postInvalidate();刷新无效
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&& private void initListView() {
&&&&&&& data = ViewApp.getData();// ViewApp是一个全局的类,程序运行时data数据即加载完毕,这是只是赋值到data成员变量中
&&&&&&& adapter = new ListViewAdapter(this, data, R.layout.adapter_item);
&&&&&&& SimpleAdapter simpleAdapter = new SimpleAdapter(this, data,
&&&&&&&&&&&&&&& R.layout.adapter_item, new String[] { &text&, &buttonText& },
&&&&&&&&&&&&&&& new int[] { R.id.textview1, R.id.button1 });
&&&&&&& listView.setAdapter(adapter);
&&& class ListViewAdapter extends BaseAdapter {
&&&&&&& private List&HashMap&String, String&&
&&&&&&& private LayoutI
&&&&&&& private HashMap&String, String& itemD
&&&&&&& public ListViewAdapter(Context context,
&&&&&&&&&&&&&&& List&HashMap&String, String&& data, int resource) {
&&&&&&&&&&& // super(context, data, resource, from, to);
&&&&&&&&&&& this.data =
&&&&&&&&&&& this.resource =
&&&&&&&&&&& inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
&&&&&&& @Override
&&&&&&& public int getCount() {
&&&&&&&&&&& return data.size();
&&&&&&& @Override
&&&&&&& public Object getItem(int position) {
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& public long getItemId(int position) {
&&&&&&&&&&& return 0;
&&&&&&& // 渲染每一个item的数据,每次上下滑动显示数据时都会调用此方法
&&&&&&& @Override
&&&&&&& public View getView(int position, View convertView, ViewGroup parent) {
&&&&&&&&&&& if (null == convertView) {
&&&&&&&&&&&&&&& convertView = inflater.inflate(resource, null);
&&&&&&&&&&& }
&&&&&&&&&&& // convertView.setTag(&abc&);
&&&&&&&&&&& itemData = data.get(position);
&&&&&&&&&&& TextView textView = (TextView) convertView
&&&&&&&&&&&&&&&&&&& .findViewById(R.id.textview1);
&&&&&&&&&&& textView.setText(itemData.get(&text&));
&&&&&&&&&&& final Button button = (Button) convertView
&&&&&&&&&&&&&&&&&&& .findViewById(R.id.button1);
&&&&&&&&&&& button.setText(itemData.get(&buttonText&));
&&&&&&&&&&& button.setOnClickListener(new View.OnClickListener() {
&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&& public void onClick(View v) {
&&&&&&&&&&&&&&&&&&& Toast.makeText(AdapterActivity.this, button.getText(),
&&&&&&&&&&&&&&&&&&&&&&&&&&& Toast.LENGTH_SHORT).show();
&&&&&&&&&&&&&&& }
&&&&&&&&&&& });
&&&&&&&&&&& return convertV
&&& class ButtonListener implements View.OnClickListener {
&&&&&&& @Override
&&&&&&& public void onClick(View v) {
&&&&&&&&&&& switch (v.getId()) {
&&&&&&&&&&& case R.id.button_add:
&&&&&&&&&&&&&&& HashMap&String, String& map = new HashMap&String, String&();
&&&&&&&&&&&&&&& map.put(&text&, &text200&);
&&&&&&&&&&&&&&& map.put(&buttonText&, &buttonText200&);
&&&&&&&&&&&&&&& data.add(map);
&&&&&&&&&&&&&&& Log.i(Constant.TAG, &ADD&);
&&&&&&&&&&&&&&&
&&&&&&&&&&& case R.id.button_delete:
&&&&&&&&&&&&&&& Log.i(Constant.TAG, &DELETE&);
&&&&&&&&&&&&&&& data.remove(1);
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&&&&&& adapter.notifyDataSetChanged();// adapter更改后刷新view
摘自& 我说_小莫&

我要回帖

更多关于 adapter edittext 的文章

 

随机推荐