Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.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 从ArrayAdapter刷新列表视图_Android_Android Listview_Android Arrayadapter - Fatal编程技术网

Android 从ArrayAdapter刷新列表视图

Android 从ArrayAdapter刷新列表视图,android,android-listview,android-arrayadapter,Android,Android Listview,Android Arrayadapter,我正在使用ArrayAdapter将我的ArrayList中的数据绑定到我的ListView,并使用AlertDialog将数据插入我的ArrayList。我的问题是,更改完成后,我无法刷新我的列表视图 代码 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.config_hidden); list

我正在使用
ArrayAdapter
将我的
ArrayList
中的数据绑定到我的
ListView
,并使用
AlertDialog
将数据插入我的
ArrayList
。我的问题是,更改完成后,我无法刷新我的
列表视图

代码

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.config_hidden);
    listView=(ListView) findViewById(R.id.hiddenList);
    xmlFileManager=new XmlFileManager(this);
    addNumber=(Button) findViewById(R.id.addNum);

    addNumber.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {

            LayoutInflater factory = LayoutInflater.from(HiddenCall.this);
            final View alertDialogView = factory.inflate(R.layout.add_number, null);
            AlertDialog.Builder adb = new AlertDialog.Builder(HiddenCall.this);
            adb.setView(alertDialogView);
            adb.setTitle(R.string.dialog_title);
            adb.setIcon(R.drawable.phone);

            final AlertDialog alertDialog = adb.create();

            adb.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    numberToAdd=(EditText) alertDialogView.findViewById(R.id.numberToAdd);
                    String number = numberToAdd.getText().toString();
                    if(number.length()>0){
                        xmlFileManager.addNumberToXml(number , HIDDEN_NUMBER_TYPE);
                        adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());
                        adapter.setNotifyOnChange(true);
                        adapter.notifyDataSetChanged();
                    }
                } });

            adb.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    alertDialog.dismiss();
                } });
            adb.show();
        }
    });
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());
    adapter.notifyDataSetChanged();
    adapter.setNotifyOnChange(true);
    listView.setAdapter(adapter);
}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.config_隐藏);
listView=(listView)findViewById(R.id.hiddenList);
xmlFileManager=新的xmlFileManager(此);
addNumber=(按钮)findViewById(R.id.addNum);
addNumber.setOnClickListener(新的OnClickListener(){
公共void onClick(视图arg0){
LayoutInflater工厂=LayoutInflater.from(HiddenCall.this);
最终视图alertDialogView=工厂。充气(R.layout.add_编号,空);
AlertDialog.Builder adb=新建AlertDialog.Builder(HiddenCall.this);
adb.setView(alertDialogView);
adb.setTitle(R.string.dialog\u title);
adb.setIcon(R.drawable.phone);
final AlertDialog AlertDialog=adb.create();
adb.setPositiveButton(R.string.ok,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
numberToAdd=(EditText)alertDialogView.findViewById(R.id.numberToAdd);
字符串编号=numberToAdd.getText().toString();
如果(number.length()>0){
addNumberToXml(数字,隐藏的\u数字\u类型);
adapter=new ArrayAdapter(getApplicationContext(),android.R.layout.simple_list_item_1,xmlFileManager.getHiddenNumber());
adapter.setNotifyOnChange(true);
adapter.notifyDataSetChanged();
}
} });
adb.setNegativeButton(R.string.cancel,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
alertDialog.disclose();
} });
adb.show();
}
});
adapter=new ArrayAdapter(这是android.R.layout.simple_list_item_1,xmlFileManager.getHiddenNumbers());
adapter.notifyDataSetChanged();
adapter.setNotifyOnChange(true);
setAdapter(适配器);
}

每次单击创建新适配器。你不需要这样做。您可以修改现有适配器数据并调用notifyDataSetChanged()。在您的情况下,应该在onClick方法中调用listView.setAdapter(adapter)。

您每次都在实例化一个新的适配器。您需要做的是将实例化适配器的行放在click listener之前,然后在click listener中修改该适配器并对其调用notifyDataSetChanged()。当然,为了修改数据,您必须向适配器添加一些setter

必须看起来与此类似:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.config_hidden);
listView=(ListView) findViewById(R.id.hiddenList);

//instantiate the adapter (just one time)
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());

//assign the adapter to the listview
listView.setAdapter(adapter);

xmlFileManager=new XmlFileManager(this);
addNumber=(Button) findViewById(R.id.addNum);

addNumber.setOnClickListener(new OnClickListener() {

    public void onClick(View arg0) {

        LayoutInflater factory = LayoutInflater.from(HiddenCall.this);
        final View alertDialogView = factory.inflate(R.layout.add_number, null);
        AlertDialog.Builder adb = new AlertDialog.Builder(HiddenCall.this);
        adb.setView(alertDialogView);
        adb.setTitle(R.string.dialog_title);
        adb.setIcon(R.drawable.phone);

        final AlertDialog alertDialog = adb.create();



        adb.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                numberToAdd=(EditText) alertDialogView.findViewById(R.id.numberToAdd);
                String number = numberToAdd.getText().toString();
                if(number.length()>0){
                    xmlFileManager.addNumberToXml(number , HIDDEN_NUMBER_TYPE);
                    //adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());
                    //adapter.setNotifyOnChange(true);

                    //set the changed data
                    adapter.setData(xmlFileManager.getHiddenNumbers());

                    //notify that the model changed
                    adapter.notifyDataSetChanged();
                }
            } });

        adb.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                alertDialog.dismiss();
            } });
        adb.show();
    }
});

//adapter.notifyDataSetChanged();
//adapter.setNotifyOnChange(true);
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.config_隐藏);
listView=(listView)findViewById(R.id.hiddenList);
//实例化适配器(仅一次)
adapter=new ArrayAdapter(这是android.R.layout.simple_list_item_1,xmlFileManager.getHiddenNumbers());
//将适配器分配给listview
setAdapter(适配器);
xmlFileManager=新的xmlFileManager(此);
addNumber=(按钮)findViewById(R.id.addNum);
addNumber.setOnClickListener(新的OnClickListener(){
公共void onClick(视图arg0){
LayoutInflater工厂=LayoutInflater.from(HiddenCall.this);
最终视图alertDialogView=工厂。充气(R.layout.add_编号,空);
AlertDialog.Builder adb=新建AlertDialog.Builder(HiddenCall.this);
adb.setView(alertDialogView);
adb.setTitle(R.string.dialog\u title);
adb.setIcon(R.drawable.phone);
final AlertDialog AlertDialog=adb.create();
adb.setPositiveButton(R.string.ok,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
numberToAdd=(EditText)alertDialogView.findViewById(R.id.numberToAdd);
字符串编号=numberToAdd.getText().toString();
如果(number.length()>0){
addNumberToXml(数字,隐藏的\u数字\u类型);
//adapter=new ArrayAdapter(getApplicationContext(),android.R.layout.simple_list_item_1,xmlFileManager.getHiddenNumber());
//adapter.setNotifyOnChange(true);
//设置更改的数据
setData(xmlFileManager.getHiddenNumbers());
//通知模型已更改
adapter.notifyDataSetChanged();
}
} });
adb.setNegativeButton(R.string.cancel,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
alertDialog.disclose();
} });
adb.show();
}
});
//adapter.notifyDataSetChanged();
//adapter.setNotifyOnChange(true);

adb.setPositiveButton()
onClick()
中,不应创建新适配器。删除此行:

adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());

如果您有一个小的ArrayList,要在ArrayList更改时强制更新ListView,可以使用以下代码段:

ArrayAdapter.clear();
ArrayAdapter.addAll(ArrayList);
ArrayAdapter.notifyDataSetChanged();

为什么每次都要创建一个新适配器而不是修改现有的适配器?您对notifyDataSetChanged()的调用如果您刚刚创建了适配器,则这些设置将毫无用处。我发现您缺少的另一件事是将适配器设置为listview…我发布了代码,希望能有所帮助。您仍然需要向适配器添加某种setter,并将更新的数据传递给它。@lxx不应该在onCreate()中设置适配器,然后在onClick()中对其进行修改吗这就是我要说的,创建和设置一次,然后在onClick()中修改(并调用notifyDataSetChanged())。@lxxArrayAdapter.clear(); ArrayAdapter.addAll(ArrayList); ArrayAdapter.notifyDataSetChanged();