Android:当我动态添加新的 ListView 条目时,ListView 中的微调器会丢失其值

2023-12-08

我的活动包含一个按钮和一个列表视图。 ListView 包含一个 Spinner 视图和一个 EditText 视图。每次我想在 Activity 的 ListView 中插入新行条目时,我都会使用该按钮。

我按照以前的 stackoverflow 线程的说明进行操作,如下所示:带有微调器和复选框的 Android 列表视图关于如何使用可聚焦对象(如 Spinners)填充 ListView。

我的问题是,每次我在 ListView 中动态添加新的 ListView 条目时,前一个 ListView 条目的 Spinner 值都会丢失(实际上 Spinner 返回到其默认设置)。为简单起见,我的 Spinner 中填充了以下数据:

 String spinner_data[] = {"apple", "banana", "pear", "watermelon", "strawberry"};

例如,如果我选择第一个 ListView 的 Spinner 值为“pear”,然后使用 Button 添加新的 ListView 条目,则“pear”条目将从第一个 ListView Spinner 中消失,并出现默认值“apple”)。

任何帮助表示赞赏!

这是我的活动:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    lv = (ListView) findViewById(R.id.lv);       
    da = new DataAdapter(this, new ArrayList<RawData>());
    lv.setAdapter(da);

    btn_new = (Button)findViewById(R.id.btn_new);

    btn_new.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            da.add(new RawData(this));
                      da.notifyDataSetChanged();
        }
    });

}

RawData 类是这样的:

 public class RawData {
private int selected_position;
private ArrayAdapter<CharSequence> adapter;

public RawData(Context context)
{
    adapter = ArrayAdapter.createFromResource(context, R.array.data, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}

public ArrayAdapter<CharSequence> getAdapter() 
{         
    return adapter;     
}

/**
 * get adapter's item text from selected position
 * @return
 */
public String getText() 
{         
    return (String) adapter.getItem(selected_position);     
}

public int getSelected() 
{   
    return selected_position;     
}

public void setSelected(int selected) 
{         
    this.selected_position = selected;     
}
 }

DataArrayAdapter 如下:

 public class DataArrayAdapter extends ArrayAdapter<RawData> {
private Activity myContext;
//private final List<RawData> list;

public DataArrayAdapter(Activity context, List<RawData> list) 
{         
    super(context, R.layout.row_view, list);         
    myContext = context;
} 

static class ViewHolder
{
    protected RawData data;
    protected Spinner spn;
    protected EditText edt;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View view = null;
    if ( convertView == null )
    {
        LayoutInflater inflator = myContext.getLayoutInflater();             
        view = inflator.inflate(R.layout.row_view, null);

        final ViewHolder viewHolder = new ViewHolder(); 

        viewHolder.edt = (EditText)view.findViewById(R.id.edt);
        viewHolder.data = new RawData(myContext);
        viewHolder.spn = (Spinner)view.findViewById(R.id.spn);
        viewHolder.spn.setAdapter(viewHolder.data.getAdapter());

    viewHolder.spn.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2_position, long arg3) {
                // TODO Auto-generated method stub
    viewHolder.data.setSelected(arg2_position);
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }
        });

        // Update the TextView to reflect what's in the Spinner
        view.setTag(viewHolder);
    }
    else
    {
        view = convertView;
    }

    // This is what gets called every time the ListView refreshes
    ViewHolder holder = (ViewHolder) view.getTag();

               holder.spn.setSelection(getItem(position).getSelected());

    return view;
}

 }

当你没有处理好这种情况时getView得到一个非空值convertView。在您的示例中,添加项目后,ListView刷新自身,并且应该显示“pear”的位置获得现有的convertView(之前用于显示“apple”的那个),您只需将其传递给ListView无需设置当前位置的数据。你不能依赖ListView存储任何数据的项目,您应该始终为位置设置正确的内容getView您的适配器的方法。 需要明确的是,我看到您的代码将所选位置设置在末尾getView但问题是,当它被传递到时,任何标记到你的convertViewgetView通过回收机制ListView是随机的,可以与它之前显示的任何位置相关联。

为了使您的应用程序正常工作,您必须为所有微调器创建 selectedItem 值数组,并将其作为成员附加到适配器。您必须更新每个 OnItemSelected 事件上的相应值,并且为每次“添加”按钮单击添加一个新值。当你准备好你的观点时getView您只需将选定的微调器索引设置为数组中的相应值即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:当我动态添加新的 ListView 条目时,ListView 中的微调器会丢失其值 的相关文章

随机推荐

  • 如何更改此代码以允许附加到列表?

    我在这段代码之后附加或实际上打印任何内容时遇到问题 reversedPriv 52 27 13 6 3 2 array 9 var 0 numA for i in array for j in reversedPriv while var
  • 如何使用 awk 或 sed 递归查找/替换字符串?

    如何查找并替换每次出现的情况 subdomainA example com with subdomainB example com 在每个文本文件中 home www 目录树递归 find home www type d name git
  • Xcode 退出时找不到 Parse/Parse.h 文件

    我在我的项目中添加了 Parse SDK 一切都很好 然而 当我退出 Xcode 并打开项目时 我收到以下错误 Parse Parse h file not found 我删除了 Parse Framework 并将其重新添加到我的项目中
  • 使用委托或 lambda 封装秒表计时?

    我正在编写这样的代码 做了一些快速而肮脏的计时 var sw new Stopwatch sw Start for int i 0 i lt 1000 i b DoStuff s sw Stop Console WriteLine sw E
  • 将字节存储到寄存器 x86-64 程序集中的问题

    我正在尝试编写一个函数来确定作为第一个参数给出的字符串的长度 因此 rdi 将包含 char ptr 当我打电话时movb rdi rcx将 rdi 指向的字符移动到 rcx 中 出现以下错误 incorrect register rdx
  • Android MediaRecorder Video - 随后播放音频和视频轨道

    我遇到了一个错误 主要出现在三星设备上 我用媒体记录器录制视频 代码如下所示 它在所有设备上都能完美运行 但现在在某些 Android 设备上 音频和视频轨道是分开的 假设我正在捕捉 5 秒的视频 视频时长为 5 秒 播放视频将播放视频的第
  • 使用ajax发送base64图像

    我正在尝试从画布中生成图像 并通过 ajax 发出的 POST 请求将其发送到服务器 我正在使用 html2canvas 将 div 转换为 canvas 并使用 toDataURL 将其转换为 base64 这是我的JS function
  • 如何在 XPath 中使用 AND 运算符?

    XML 就像 a b value1 b b value2 b a 我想写 XPath 来查找 id a 那里会有两个 b 具有固定值的子节点value1 and value2 我试图找出 XPath 的条件如下 xml gt xpath b
  • 在 Objective-C 中如何在视图控制器之间传递对象?

    我花了两天时间艰难地研究一些代码 试图找出为什么我无法获取我在 h 中声明并在 m 中实现并在 viewDidLoad 函数中设置的全局 NSMutableArray 变量 我终于明白了 Objective C 中不存在全局变量这样的东西
  • 横向启动应用程序会导致启动时旋转

    我已经实现了shouldAutorotateToInterfaceOrientation 并且在我的应用程序运行后 在条款或方向更改方面一切正常 但是 我不喜欢我的应用程序首次启动时的行为 当我以纵向启动我的应用程序时 它会按预期打开 但是
  • 如何确定 Android 中的语音信箱电话号码

    如何在 Android 代码中确定手机的语音信箱号码 您可以在 TelephonyManager 类中使用 getVoiceMailNumber 请注意 这可能不适用于所有手机提供商 Android 电话管理器
  • 如何将 .dds 文件加载到图片框中?

    如何在 C 中将 dds 纹理文件加载为图像 我在谷歌上找不到任何有用的东西 你给我的信息和样本越多 我就越能理解它 我遇到过同样的问题 这是一个很好的解决方案 Source http www mastropaolo com devildo
  • Azure 数据工厂:事件未启动管道

    我已经设置了一个包含复制活动的 Azure 数据工厂管道 出于测试目的 源和接收器都是 Azure Blob 存储 我不想在源 Azure Blob 存储上创建新文件后立即执行管道 我创建了 BlovEventsTrigger 类型的触发器
  • 类型 Set 不带参数

    package set import java util public class Set public static void main String args String things appple bob ham bob bacon
  • 使用 decltype() 和三元运算符有条件地选择类型

    我有一个文件a cpp include
  • 使用 C# 在 WebDriver 中打开新窗口

    EDIT 4 EDIT 3 EDIT 2 string currentWindow driver CurrentWindowHandle driver SwitchTo Window string childTitle driver Tit
  • .py 和 .pyc 文件有什么区别? [复制]

    这个问题在这里已经有答案了 我注意到了 pyc当某些情况下会自发生成文件 py运行同名文件 有什么区别 py and pyc files 另外 我发现有 pyc周围的文件使空间变得混乱 是否应该删除 pyc文件 或者让它们存在有什么好处和
  • Python3 表情符号字符作为 unicode

    我在 python3 中有一个字符串 其中包含表情符号 我想将表情符号视为它们的 unicode 表示形式 我需要对这种格式的表情符号进行一些操作 s hello 这将每个表情符号视为自己的角色 这样len s 9 s 0 我想更改字符串的
  • 如何使用子字符串分割字符串

    我有一个像 Test1 Test2 这样的字符串 我需要将 Test2 与它分开 我怎样才能在 C 中做到这一点 尝试这个 string toSplit Test1 Test2 toSplit Split or toSplit Split
  • Android:当我动态添加新的 ListView 条目时,ListView 中的微调器会丢失其值

    我的活动包含一个按钮和一个列表视图 ListView 包含一个 Spinner 视图和一个 EditText 视图 每次我想在 Activity 的 ListView 中插入新行条目时 我都会使用该按钮 我按照以前的 stackoverfl