如何在Android中使用ArrayAdapter删除ListView中的所有项目

如何在Android中使用ArrayAdapter删除ListView中的所有项目,android,Android,我正在开发一个由函数动态填充的Listview,该函数返回接收字符串参数的ArrayAdapter。此字符串参数是另一个动态填充微调器的选定项 当函数返回的ArrayAdapter中的项目数大于0时,Listview将使用新项目成功刷新,但当函数在ArrayAdapter中返回0个项目时,Listview不会清除以前的项目。以下是我正在编写的代码: ManifiestoSpinner = (Spinner) findViewById(R.id.spnManifiesto); FacturasLi

我正在开发一个由函数动态填充的Listview,该函数返回接收字符串参数的ArrayAdapter。此字符串参数是另一个动态填充微调器的选定项

当函数返回的ArrayAdapter中的项目数大于0时,Listview将使用新项目成功刷新,但当函数在ArrayAdapter中返回0个项目时,Listview不会清除以前的项目。以下是我正在编写的代码:

ManifiestoSpinner = (Spinner) findViewById(R.id.spnManifiesto);
FacturasListview = (ListView) findViewById(R.id.lvwFacturas);

ManifiestoSpinner = (Spinner)
    ManifiestoSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

            String EstadoID = EstadoSpinner.getSelectedItem().toString();
            ArrayList<String> ListManifiestos = (ArrayList<String>)Factura.GetManifiestosByEstado(EstadoID);

            ActualizarManifiestSpinner(manifiesto);

        }

        public void onNothingSelected(AdapterView<?> arg0) {

        }

private void ActualizarManifiestSpinner (ArrayList<String> manifiesto)
    {

    String[] datos = new String[manifiesto.size()];
    ArrayAdapter<String> AdapterManifiesto = new ArrayAdapter<String>(getApplicationContext(),
            android.R.layout.simple_spinner_dropdown_item, manifiesto.toArray(datos));

    ManifiestoSpinner.setAdapter(AdapterManifiesto);

}

ManifiestoSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

            String Manifiesto = ManifiestoSpinner.getSelectedItem().toString();
            String Estado = EstadoSpinner.getSelectedItem().toString();
            fillData(Estado, Manifiesto);

            return;
        }

        public void onNothingSelected(AdapterView<?> arg0) {

        }

    });

private void fillData(String EstadoID, String ManifiestoID) {


    ArrayAdapter<String> adapter = (ArrayAdapter<String>) FacturasListview.getAdapter();

    if(adapter!= null)
    {
        adapter.clear();
        FacturasListview.setAdapter(adapter);
        FacturasListview.invalidateViews();
    }

    List<String> from = Factura.GetListClientesByEstadoManifiesto(EstadoID, ManifiestoID);

    adapter = new ArrayAdapter<String>(this,R.layout.factura_row, R.id.text1 ,from);
    FacturasListview.setAdapter(adapter);



}
ManifiestoSpinner=(Spinner)findViewById(R.id.spnManifiesto);
FacturasListview=(ListView)findViewById(R.id.lvwFacturas);
ManifiestoSpinner=(微调器)
ManifiestoSpinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
已选择公共视图(AdapterView arg0、视图arg1、内部arg2、长arg3){
字符串EstadoID=EstadoSpinner.getSelectedItem().toString();
ArrayList ListManifiestos=(ArrayList)Factura.GetManifiestosByEstado(EstadoID);
ManifiestSpinner(manifiesto);
}
未选择公共无效(AdapterView arg0){
}
专用手动微调器(ArrayList manifiesto)
{
String[]datos=新字符串[manifiesto.size()];
ArrayAdapter AdapterManifiesto=新的ArrayAdapter(getApplicationContext(),
android.R.layout.simple_微调器_下拉列表_项,manifiesto.toArray(datos));
ManifiestoSpinner.setAdapter(AdapterManifiesto);
}
ManifiestoSpinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
已选择公共视图(AdapterView arg0、视图arg1、内部arg2、长arg3){
字符串Manifiesto=ManifiestoSpinner.getSelectedItem().toString();
字符串Estado=EstadoSpinner.getSelectedItem().toString();
fillData(Estado、Manifiesto);
返回;
}
未选择公共无效(AdapterView arg0){
}
});
私有void fillData(字符串EstadoID、字符串ManifiestoID){
ArrayAdapter=(ArrayAdapter)FacturasListview.getAdapter();
if(适配器!=null)
{
适配器。清除();
FacturasListview.setAdapter(适配器);
FacturasListview.invalidateViews();
}
List from=Factura.getListClientsByStatomanifiesto(EstadoID,ManifiestoID);
适配器=新阵列适配器(此,R.layout.factura_行,R.id.text1,from);
FacturasListview.setAdapter(适配器);
}

当从调用的列表具有from.size()=0时,以前显示在Listview上的项目不会被清除。

fillData
方法中

 if(adapter!= null)
    {
        adapter.clear();
        FacturasListview.setAdapter(adapter);// !!!!!!!
        FacturasListview.invalidateViews();
    }
调用
adapter.clear();
后,设置
列表视图的适配器不会改变任何内容
只需调用FacturasListview.notifyDatasetChanged()

像这样

 if(adapter!= null)
        {
            adapter.clear();
            FacturasListview.notifyDatasetChanged();
        }
class MyAdpater {
List<String> list; 
.....
.....


public void setAdpaterList(List<String>list){
this.list= list;
}
}
这将清除列表中的所有视图

如果您想更改ListView的适配器,我将使用一种方法制作一个自定义数组适配器,该方法采用
List
并更改
adapter
List
的先前引用,然后调用
notifyDatasetChanged();
像这样

 if(adapter!= null)
        {
            adapter.clear();
            FacturasListview.notifyDatasetChanged();
        }
class MyAdpater {
List<String> list; 
.....
.....


public void setAdpaterList(List<String>list){
this.list= list;
}
}
类myadpeter{
名单;
.....
.....
公共无效setAdpaterList(列表列表){
this.list=list;
}
}

然后在您的适配器上调用此方法调用
notifyDatasetChange()
谢谢Nammari。我遵循了您的建议,但FacturasListview没有名为notifyDatasetChanged()的方法,适配器有,因此我得到了以下代码:

ArrayAdapter<String> adapter = (ArrayAdapter<String>) mFacturasListview.getAdapter();

if(adapter!= null)
{
    adapter.clear();
    adapter.notifyDataSetChanged();
}
ArrayAdapter adapter=(ArrayAdapter)mFacturasListview.getAdapter();
if(适配器!=null)
{
适配器。清除();
adapter.notifyDataSetChanged();
}
Listview仍然不会刷新项目。我正在寻找一种方法,可以清除接收ArrayAdapter的Listview中的所有项目。我正在上载两张图片以显示我正在处理的内容

在这种情况下,第一个微调器有一个selecteditem().toString()=“POR RECIBIR”,并基于该参数,第二个微调器动态填充所有具有(document.State=“POR RECIBIR”)的文档的代码。填充第二个微调器后,第三个方法称为“fillData”用文档中包含的所有客户名称填充ListView。代码如下:

private void fillData(String EstadoID, String ManifiestoID) {


ArrayAdapter<String> adapter = (ArrayAdapter<String>) mFacturasListview.getAdapter();

if(adapter!= null)
{
    adapter.clear();
    adapter.notifyDataSetChanged();
}

List<String> from = Factura.GetListClientesByEstadoManifiesto(EstadoID, ManifiestoID);

adapter = new ArrayAdapter<String>(this,R.layout.factura_row, R.id.text1 ,from);
FacturasListview.setAdapter(adapter);
private void fillData(字符串EstadoID、字符串ManifiestoID){
ArrayAdapter=(ArrayAdapter)mFacturasListview.getAdapter();
if(适配器!=null)
{
适配器。清除();
adapter.notifyDataSetChanged();
}
List from=Factura.getListClientsByStatomanifiesto(EstadoID,ManifiestoID);
适配器=新阵列适配器(此,R.layout.factura_行,R.id.text1,from);
FacturasListview.setAdapter(适配器);
}

当第一个微调器有一个selecteditem().toString()=“POR ENTREGAR”时,就会出现问题。根据该参数,我们发现0个文档有(document.State=“POR ENTREGAR”)。在这里,第三个名为“fillData”的方法应该清除所有ListView项,但它没有。这是图像:


谢谢Nammari。我遵循了你的建议,但我发布了一个详细信息。