Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当屏幕方向改变时,ListView在列表中添加了重复项_Android_Listview_Android Adapter_Baseadapter_Android Orientation - Fatal编程技术网

Android 当屏幕方向改变时,ListView在列表中添加了重复项

Android 当屏幕方向改变时,ListView在列表中添加了重复项,android,listview,android-adapter,baseadapter,android-orientation,Android,Listview,Android Adapter,Baseadapter,Android Orientation,我试图创建列表视图,但在方向改变时遇到了一些问题。 问题是:当我改变屏幕列表视图的方向时,在列表中添加重复的列表项。如何限制此数据更改 代码是: public class DayPlannerActivity extends Activity { private TextView txtHeader; private Context mContext; private ListView lvDayplanner; private DayPlannerAda

我试图创建列表视图,但在方向改变时遇到了一些问题。 问题是:当我改变屏幕列表视图的方向时,在列表中添加重复的列表项。如何限制此数据更改

代码是:

   public class DayPlannerActivity extends Activity {

    private TextView txtHeader;
    private Context mContext;
    private ListView lvDayplanner;
    private DayPlannerAdapter adapter;
    private Activity activity;
    private static Vector<DayPlanner> list = new Vector<DayPlanner>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dayplanner);
        mContext = this;    
        activity = this;
        txtHeader = (TextView) findViewById(R.id.txtHeader);
        txtHeader.setText(R.string.haivlate);
        String[] Checks = {"select","Check1","Check2"};
        DayPlanner dp = new  DayPlanner("11:00 PM", Checks);
        list.add(dp);
        dp = new  DayPlanner("12:00 PM", Checks);
        list.add(dp);
        lvDayplanner = (ListView) findViewById(R.id.lvDayplanner);
        adapter= new DayPlannerAdapter(activity,list);
        lvDayplanner.setAdapter(adapter);
   }

}
公共类DayPlanner活动扩展活动{
私有文本视图txtHeader;
私有上下文;
私有ListView lvDayplanner;
专用适配器;
私人活动;
私有静态向量列表=新向量();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.dayplanner);
mContext=这个;
活动=此;
txtHeader=(TextView)findViewById(R.id.txtHeader);
setText(R.string.haivlate);
字符串[]检查={“选择”、“检查1”、“检查2”};
DayPlanner dp=新的DayPlanner(“晚上11:00”,检查);
增加(dp);
dp=新的日计划表(“下午12:00”,支票);
增加(dp);
lvDayplanner=(ListView)findViewById(R.id.lvDayplanner);
适配器=新的DayPlannerAdapter(活动,列表);
lvDayplanner.setAdapter(适配器);
}
}
列表适配器:

   public class DayPlannerAdapter extends BaseAdapter {

    private Activity mActivity;
    private static Vector<DayPlanner> list;
    private static LayoutInflater inflater;
    public DayPlannerAdapter ( Activity _activity,Vector<DayPlanner> _list) {
        mActivity = _activity;
        list = _list;
        inflater = (LayoutInflater)mActivity.getSystemService(mActivity.LAYOUT_INFLATER_SERVICE);
    }

    public static class ViewHolder{
        public TextView txtScheduledTime;
        public Spinner spnrChecks;
        public Button btnGo;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

         View vi=convertView;
            ViewHolder holder;
            if(convertView==null){
                vi = inflater.inflate(R.layout.dayplanner_listitem, null);
                holder=new ViewHolder();
                holder.txtScheduledTime=(TextView)vi.findViewById(R.id.txtScheduledTime);
                holder.spnrChecks = (Spinner) vi.findViewById(R.id.spnrChecks);
                holder.btnGo = (Button) vi.findViewById(R.id.btnGo);
                vi.setTag(holder);
            }
            else
              holder=(ViewHolder)vi.getTag();

            holder.txtScheduledTime.setText(list.get(position).getScheduledTime());
            ArrayAdapter<String> spnrAdapter=new ArrayAdapter<String>(mActivity,
                    android.R.layout.simple_spinner_item, list.get(position).getChecks());
            spnrAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);   
            holder.spnrChecks.setAdapter(spnrAdapter);

            holder.btnGo.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                     Intent i = new Intent();
                     i.setClass(mActivity,DayPlannerFormActivity.class);
                     mActivity.startActivity(i);
                }
            });

        return vi;
    }

}
公共类DayPlannerAdapter扩展了BaseAdapter{
私人活动能力;
私有静态向量表;
私人静电充气机;
public DayPlannerAdapter(活动-活动,向量-列表){
mActivity=_活动;
列表=_列表;
充气机=(LayoutInflater)mActivity.getSystemService(mActivity.LAYOUT\u充气机\u服务);
}
公共静态类视图持有者{
公共文本视图txtScheduledTime;
公共微调器;
公共按钮;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回list.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
视图vi=转换视图;
视窗座;
if(convertView==null){
vi=充气机充气(R.layout.dayplanner\u列表项,空);
holder=新的ViewHolder();
holder.txtScheduledTime=(TextView)vi.findViewById(R.id.txtScheduledTime);
holder.spnrChecks=(微调器)vi.findViewById(R.id.spnrChecks);
holder.btnGo=(按钮)vi.findViewById(R.id.btnGo);
vi.setTag(支架);
}
其他的
holder=(ViewHolder)vi.getTag();
holder.txtScheduledTime.setText(list.get(position.getScheduledTime());
ArrayAdapter spnrAdapter=新的ArrayAdapter(MacActivity,
android.R.layout.simple_微调器_项,list.get(position.getChecks());
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉项);
holder.spnrChecks.setAdapter(spnrAdapter);
holder.btnGo.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
意图i=新意图();
i、 setClass(MacActivity,DayPlannerFormActivity.class);
恒星触觉(i);
}
});
返回vi;
}
}

由于Android会在方向改变时自动保存
视图
s状态,因此您需要一种方法来知道它是否不是第一次调用
onCreate
。幸运的是,这很容易:重写
onSaveInstanceState
,甚至存储1个值,使您在创建
onCreate
时获取的包不为空

@Override
public void onSaveInstanceState(Bundle outInstanceState) {
    outInstanceState.putInt("value", 1);
}
然后,当重新创建活动时,
onCreate
中的参数
savedInstanceState
将不为空。因此,只需进行测试:

if(savedInstanceState != null)

在向视图添加数据之前。

由于Android会在方向改变时自动保存视图的状态,因此您需要一种方法来知道它是否不是第一次调用onCreate。幸运的是,这很容易:重写
onSaveInstanceState
,甚至存储1个值,使您在创建
onCreate
时获取的包不为空

@Override
public void onSaveInstanceState(Bundle outInstanceState) {
    outInstanceState.putInt("value", 1);
}
然后,当重新创建活动时,
onCreate
中的参数
savedInstanceState
将不为空。因此,只需进行测试:

if(savedInstanceState != null)

将数据添加到视图之前。

这是因为dayplanner对象列表是静态的,因此当您更改视图方向时,它会重新创建活动,但在java中,静态对象不会重新创建,而是为该类型保存,因此会使列表具有两个相同的对象。

这是因为dayplanner对象列表是静态的,因此,当您更改视图的方向时,它会重新创建活动,但由于在java中不会重新创建静态对象,而是为该类型保存静态对象,因此会使列表中有两个相同的对象。

太晚了,这里的参与者仍然会回答,因为这可能对其他人有用。我也遇到了同样的问题,它是通过
正确地实现视图持有者设计模式来解决的

太晚了,这里的当事人仍然会回答,因为它可能对其他人有用。我也遇到了同样的问题,它是通过
正确地实现视图保持架设计模式来解决的

我可以,但我不会,因为你可以在网上找到大量的示例。我可以,但我不会,因为你可以在网上找到大量的示例。