android listview滚动 edittext 数据就变了

可以明确,现在没有直接方法可以获得ListView中每一行EditText的值.

解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值.

    大概算法:重写BaseAdapter.getView函数,用一个数组存储EditText中的值,根据position即数组下标,在getView中动态更新EditText和动态获取EditText中的值.因为ListView中的item是复用的,如果不动态清空或动态获取EditText中值,就会出现数据紊乱,或者没数据.那么在生成EditText的时候要监控其值的变化.存储下来.

package com.exmyth.android;

public class ListEditorAdapter extends BaseAdapter {

private LayoutInflater mInflater;

private List<Map<String, Object>> mData;// 存储的EditText值

public Map<String, String> editorValue = new HashMap<String, String>();//

public ListEditorAdapter(Context context, List<Map<String, Object>> data) {

mData = data;

mInflater = LayoutInflater.from(context);

init();

}

// 初始化

private void init() {

editorValue.clear();

}

@Override

public int getCount() {

return mData.size();

}

@Override

public Object getItem(int position) {

return null;

}

@Override

public long getItemId(int position) {

return 0;

}

private Integer index = -1;

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

// convertView为null的时候初始化convertView。

if (convertView == null) {

holder = new ViewHolder();

convertView = mInflater.inflate(R.layout.listview_item, null);

holder.name = (TextView) convertView

.findViewById(R.id.list_item_name);

holder.title = (TextView) convertView

.findViewById(R.id.list_item_title);

holder.value = (EditText) convertView

.findViewById(R.id.list_item_inputvalue);

holder.value.setTag(position);

holder.userkey = (TextView) convertView.findViewById(R.id.user_key);

holder.value.setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_UP) {

index = (Integer) v.getTag();

}

return false;

}

});

class MyTextWatcher implements TextWatcher {

public MyTextWatcher(ViewHolder holder) {

mHolder = holder;

}

private ViewHolder mHolder;

@Override

public void onTextChanged(CharSequence s, int start,

int before, int count) {

}

@Override

public void beforeTextChanged(CharSequence s, int start,

int count, int after) {

}

@Override

public void afterTextChanged(Editable s) {

if (s != null && !"".equals(s.toString())) {

int position = (Integer) mHolder.value.getTag();

mData.get(position).put("list_item_inputvalue",

s.toString());// 当EditText数据发生改变的时候存到data变量中

}

}

}

holder.value.addTextChangedListener(new MyTextWatcher(holder));

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

holder.value.setTag(position);

}

Object value = mData.get(position).get("list_item_name");

if (value != null) {

holder.name.setText((String) value);

}

value = mData.get(position).get("list_item_title");

if (value != null) {

holder.title.setText(value.toString());

}

value = mData.get(position).get("user_key");

if (value != null) {

holder.userkey.setText(value.toString());

} else {

holder.userkey.setText("-1");

}

value = mData.get(position).get("list_item_inputvalue");

if (value != null && !"".equals(value)) {

holder.value.setText(value.toString());

} else {

String key = mData.get(position).get("user_key").toString();

String inputValue = editorValue.get(key);

holder.value.setText(inputValue);

}

holder.value.clearFocus();

if (index != -1 && index == position) {

holder.value.requestFocus();

}

return convertView;

}

public final class ViewHolder {

public TextView name;

public TextView title;

public EditText value;// ListView中的输入

public TextView userkey;// 用来定义的标志性主键,可不用关心

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 01:23:57

android listview滚动 edittext 数据就变了的相关文章

android listview滚动到顶部

1.为了实现类似IOS点击状态栏,列表回滚到顶部的功能(要平滑滚动效果),android上点击一个按钮或是图片什么的也可以让listview一次性滚动到顶部(滑动太多页时,一次可能滚不到顶部,使用handler定时监听,继续滚动,直至回到顶部) public static void scrollToListviewTop(final AbsListView listView)    {        listView.smoothScrollToPosition(0);        final

Android ListView 滚动的N种方法

Android 里面让ListView滚动有N种方法,这儿列举三种: 我的需求是通过按键让Listview滚动起来,当然这些按键不是通过Android标识接口传输过来的,所以不能通过监听按键事件来实现此功能: 一.方法一: 也是最常用的方法: Java代码 listView.setSelection(position); 直接跳转到指定的位置,可以是事件每触发一次,执行一次,形成滚动效果: 二.方法二: Java代码 listView.smoothScrollBy(30, 200); listV

android ListView与EditText共存错位

在一个ListView中,如果里面有EditText会很麻烦,因为修改EditText里面的数据会发生错位现象. 这时候,需要在适配器BaseAdapter的getView中设置setTag(),将position缓存起来. 下面来解决这个问题. 1.打开activity_main.xml . <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt

android listView 滑动载入数据 该数据是服务端获取的

package com.sunway.works.applycash; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import com.sunway.works.R; import com.sunway.works.applycash.ApplyCashListActivity; impo

Android ListView动态更新数据

ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中. 先看看效果: 需要注意的是在什么时候去更新数据 ,listVIew的setOnScrollListener监听是否滚到了最后一条记录, 取到的数据加到list中,最后记得调用adapter的notifyDataSetChanged,通知listview改变. 不废话,上代码. 主文件: mport ja

Android listView如何判断数据多屏显示 (2012-03-06 09:47:04)

@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // System.out.println("firstVisibleItem"+firstVisibleItem); // System.out.println("visibleItemCount"+visibleItemCount);

Android中ListView滑动时数据混乱

相信做过Android应用开发的或多或少的都遇到过这样的问题,要不就是在ListView滑动时出现数据混乱,或者是GridView滑动时出现数据混乱.先来看看一位网友写的文章,个人感觉这篇文章挺不错的: Android ListView滑动过程中图片显示重复错位闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行i

Android ListView滑动过程中图片显示重复错乱闪烁问题解决

转自:http://www.oschina.net/question/221817_121051 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则p

Android ListView滑动过程中图片显示重复错位闪烁问题解决[转载]

转自:here 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存:b. 获取滑入屏幕的行item之前会先判断缓存中是否有可