【问题标题】:How To Delete all items In ListView using ArrayAdapter in Android如何在 Android 中使用 ArrayAdapter 删除 ListView 中的所有项目
【发布时间】:2012-02-08 23:52:21
【问题描述】:

我正在开发一个 Listview 由一个函数动态填充,该函数返回一个接收 String 参数的 ArrayAdapter。这个字符串参数是另一个动态填充的 Spinner 的选中项。

当函数返回一个 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);



}

当调用 from 的 List 的 from.size() = 0 时,之前在 Listview 上显示的项目不会被清除。

【问题讨论】:

    标签: android


    【解决方案1】:

    感谢纳马里。我听从了你的建议,但 FacturasListview 没有一个名为 notifyDatasetChanged() 的方法,适配器有,所以我得到了这个代码:

    ArrayAdapter<String> adapter = (ArrayAdapter<String>) mFacturasListview.getAdapter();
    
    if(adapter!= null)
    {
        adapter.clear();
        adapter.notifyDataSetChanged();
    }
    

    Listview 仍然不会刷新项目。我正在寻找一种方法来清除接收 ArrayAdapter 的 ListView 的所有项目。我正在上传两张图片来展示我的工作。

    "Imagen 1"

    在这种情况下,第一个微调器有一个 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);
    

    }

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

    "Imagen 2"

    【讨论】:

      【解决方案2】:

      在您的fillData 方法中

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

      在调用adapter.clear(); 之后设置ListView 的适配器不会改变任何东西 只需调用 FacturasListview.notifyDatasetChanged();

      喜欢这个

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

      这应该清除列表中的所有视图

      如果您想更改 ListView 的适配器,我将使用采用 List 的方法制作一个自定义数组适配器,并更改 adapterList 的先前引用,然后调用 @987654329 @ 像这样

      class MyAdpater {
      List<String> list; 
      .....
      .....
      
      
      public void setAdpaterList(List<String>list){
      this.list= list;
      }
      }
      

      然后在你的适配器上调用这个方法调用notifyDatasetChange()

      【讨论】:

      • 谢谢纳马里。我听从了你的建议,但我发布了一个细节。
      猜你喜欢
      • 2011-06-09
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      相关资源
      最近更新 更多