Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android:当我添加动态新的ListView条目时,ListView中的旋转器会丢失它们的值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的活动包含一个按钮和一个ListView. ListView包含Spinner和EditText视图.每次我想在Activity的ListView中插入一个新的行条目时,我都会使用该按钮.

我遵循了之前的stackoverflow线程的指示,如下所示:Android Listview with spinner and a checkbox关于如何使用像Spinners这样的可聚焦对象填充ListViews.

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

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获得非null的convertView时,您不会处理这种情况.在你的例子中,在你添加一个项目之后,ListView刷新自己,并且应该显示’pear’的位置获得一个现有的convertView(之前用于显示’apple’的那个),你只需将它传递给ListView而不设置当前位置的数据.您不能依赖ListView项来存储任何数据,您应该始终在适配器的getView方法中为位置设置正确的内容.
为了清楚起见,我看到你的代码在getView的末尾设置了所选位置,但问题是当它通过ListView中的回收器机制传递给getView时被标记到convertView的任何内容都是随机的,并且可以与任何位置相关联它以前用来显示.

要使应用程序正常工作,您必须为所有微调器创建SELEctedItem值数组,并将其作为成员附加到适配器.您必须更新每个OnItemSELEcted事件的相应值,并为每个“添加”按钮单击添加新值.当您在getView中准备视图时,您只需将选定的微调器索引设置为数组中的相应值.

大佬总结

以上是大佬教程为你收集整理的Android:当我添加动态新的ListView条目时,ListView中的旋转器会丢失它们的值全部内容,希望文章能够帮你解决Android:当我添加动态新的ListView条目时,ListView中的旋转器会丢失它们的值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。