Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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
Java Android listview数据没有';重新创建时不会持久_Java_Android - Fatal编程技术网

Java Android listview数据没有';重新创建时不会持久

Java Android listview数据没有';重新创建时不会持久,java,android,Java,Android,我有一个listview,它使用一个自定义的arrayadapter加载带有文本+单选按钮的布局。用户一次只能选择列表中的一个项目,因此基本上任何时候都只能“选中”一个单选按钮。除了重新创建活动(如旋转屏幕)外,此操作非常有效。我不明白它为什么要这么做,所以也许你们都能想点什么 以下是具有listview的活动的代码: import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Acti

我有一个listview,它使用一个自定义的arrayadapter加载带有文本+单选按钮的布局。用户一次只能选择列表中的一个项目,因此基本上任何时候都只能“选中”一个单选按钮。除了重新创建活动(如旋转屏幕)外,此操作非常有效。我不明白它为什么要这么做,所以也许你们都能想点什么

以下是具有listview的活动的代码:

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.support.v4.app.NavUtils;
import android.widget.AdapterView;

public class TimeForm extends Activity implements AdapterView.OnItemClickListener {

    private MyArrayAdapter maa;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_form);
        // Show the Up button in the action bar.
        getActionBar().setDisplayHomeAsUpEnabled(true);

        ListView lv = (ListView) findViewById(R.id.listView1);
        lv.setItemsCanFocus(false);

        String listitems[] = new String[16];

        listitems[0] = "Other";

        for(int i = 1; i < 16; i++)
        {
            listitems[i] = "Job " + i;
        }

        maa = new MyArrayAdapter(this, R.layout.layout_list, listitems);

        if(savedInstanceState != null)
            maa.selIndex = savedInstanceState.getInt("selIndex");

        lv.setAdapter(maa);
        lv.setOnItemClickListener(this);

    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        EditText et = (EditText) this.findViewById(R.id.editText1);

        if(position == 0)
        {
            et.setVisibility(View.VISIBLE);
        } else {
            et.setVisibility(View.GONE);
        }

        if(maa.selItem != null)
        {
            RadioButton rOld = (RadioButton) maa.selItem.findViewById(R.id.radioButton1);
            rOld.setChecked(false);
        }

        RadioButton r = (RadioButton) view.findViewById(R.id.radioButton1);
        r.setChecked(true);

        maa.selIndex = position;
        maa.selItem = view;
    }

    public void onSaveInstanceState(Bundle b)
    {
        b.putInt("selIndex", maa.selIndex);

        super.onSaveInstanceState(b);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_time_form, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            // This ID represents the Home or Up button. In the case of this
            // activity, the Up button is shown. Use NavUtils to allow users
            // to navigate up one level in the application structure. For
            // more details, see the Navigation pattern on Android Design:
            //
            // http://developer.android.com/design/patterns/navigation.html#up-vs-back
            //
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}
导入android.os.Bundle;
导入android.annotation.SuppressLint;
导入android.app.Activity;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.EditText;
导入android.widget.ListView;
导入android.widget.RadioButton;
导入android.widget.TextView;
导入android.support.v4.app.NavUtils;
导入android.widget.AdapterView;
公共类时间形式扩展活动实现AdapterView.OnItemClickListener{
私人MyArrayAdapter maa;
@SuppressLint(“新API”)
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u time\u表单);
//在操作栏中显示“向上”按钮。
getActionBar().setDisplayHomeAsUpEnabled(true);
ListView lv=(ListView)findViewById(R.id.listView1);
lv.setItemsCanFocus(假);
String listitems[]=新字符串[16];
列表项[0]=“其他”;
对于(int i=1;i<16;i++)
{
列表项[i]=“作业”+i;
}
maa=新的MyArrayAdapter(此,R.layout.layout_列表,列表项);
如果(savedInstanceState!=null)
maa.selfindex=savedInstanceState.getInt(“selfindex”);
低压设置适配器(maa);
lv.setOnItemClickListener(本);
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id)
{
EditText et=(EditText)this.findViewById(R.id.editText1);
如果(位置==0)
{
et.setVisibility(View.VISIBLE);
}否则{
et.setVisibility(View.GONE);
}
如果(maa.selItem!=null)
{
RadioButton rOld=(RadioButton)maa.selItem.findViewById(R.id.radioButton1);
rOld.setChecked(假);
}
RadioButton r=(RadioButton)视图.findViewById(r.id.radioButton1);
r、 setChecked(true);
maa.selIndex=位置;
maa.selItem=视图;
}
SaveInstanceState上的公共无效(捆绑包b)
{
b、 putInt(“selIndex”,maa.selIndex);
super.onSaveInstanceState(b);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.activity\u time\u表单,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例android.R.id.home:
//此ID表示“主页”或“向上”按钮
//活动中,将显示向上按钮。使用NavUtils允许用户
//在应用程序结构中向上导航一级。对于
//更多详细信息,请参见Android Design上的导航模式:
//
// http://developer.android.com/design/patterns/navigation.html#up-对背
//
NavUtils.navigateUpFromSameTask(本);
返回true;
}
返回super.onOptionsItemSelected(项目);
}
}
MyArrayAdapter类的代码:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.RadioButton;
import android.widget.TextView;

public class MyArrayAdapter extends ArrayAdapter<String> {

    private Context context;
    private String[] strings;
    private int layoutID;

    public int selIndex;
    public View selItem;

    public MyArrayAdapter(Context c, int id, String[] values)
    {
        super(c, id, values);

        selIndex = -1;
        selItem = null;

        this.strings = values;
        this.context = c;
        layoutID = id;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rView = inflater.inflate(layoutID, parent, false);

        TextView tv = (TextView) rView.findViewById(R.id.textView1);
        tv.setText(strings[position]);

        if(position == selIndex)
        {
            RadioButton r = (RadioButton) rView.findViewById(R.id.radioButton1);
            r.setChecked(true);
            selItem = rView;
        }


        return rView;
    }


}
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.RadioButton;
导入android.widget.TextView;
公共类MyArrayAdapter扩展了ArrayAdapter{
私人语境;
私有字符串[]字符串;
私人内部布局;
公共综合指数;
公众视野项目;
公共MyArrayAdapter(上下文c、整数id、字符串[]值)
{
super(c,id,value);
selIndex=-1;
selItem=null;
this.strings=值;
this.context=c;
layoutID=id;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
View rView=充气机。充气(layoutID,parent,false);
TextView tv=(TextView)rView.findViewById(R.id.textView1);
tv.setText(字符串[位置]);
如果(位置==selIndex)
{
RadioButton r=(RadioButton)rView.findViewById(r.id.radioButton1);
r、 setChecked(true);
selItem=rView;
}
返回视图;
}
}

首先,关于“重新创建”视图。。退房

例如,您可以定义
public void onConfigurationChanged(Configuration newConfig)
以确保您的活动不会在轮换时重新创建


也就是说,如果要持久化这些值,您必须实际执行该操作,然后对传递到ArrayAdapter中的集合应用任何选择。

我找到了答案。我不确定这是否是最好的解决方案,但它可以工作,不会造成任何明显的性能损失^_^

在TimeForm活动的onItemClick()方法中,我在底部添加了以下内容:

ListView lv = (ListView) findViewById(R.id.listView1);
lv.invalidateViews();

这将强制listview重新绘制所有子视图。感谢所有花时间帮我解决这个问题的人。

到底是什么不起作用?用户是否可以选择多个条目,或者以前选择的条目是否不再可见?请澄清。^我假设单选按钮没有保持选中状态……不,单选按钮保持选中状态。但是,假设我检查第二个r