【问题标题】:Remove ListView items in Android在 Android 中删除 ListView 项目
【发布时间】:2011-02-03 06:07:02
【问题描述】:

谁能给我一个删除所有 ListView 项目并替换为新项目的示例代码?

我尝试更换适配器项目但没有成功。我的代码是

populateList(){

 results //populated arraylist with strings

 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, results);

 listview.setAdapter(adapter);
 adapter.notifyDataSetChanged();
 listview.setOnItemClickListener(this);

}

// now populating list again

repopulateList(){

 results1 //populated arraylist with strings

 ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, results1);

 listview.setAdapter(adapter1);
 adapter1.notifyDataSetChanged();
 listview.setOnItemClickListener(this);
}

这里repopulateList() 方法将添加到 ListView 项目,但它不会删除/替换所有 ListView 项目。

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    您将希望 remove() 来自适配器对象的项目,然后只需在适配器上运行 notifyDatasetChanged(),任何 ListViews 都将(应该)自行回收和更新。

    这是一个简短的活动示例,AlertDialogs:

    adapter = new MyListAdapter(this);
        lv = (ListView) findViewById(android.R.id.list);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> a, View v, int position, long id) {
            AlertDialog.Builder adb=new AlertDialog.Builder(MyActivity.this);
            adb.setTitle("Delete?");
            adb.setMessage("Are you sure you want to delete " + position);
            final int positionToRemove = position;
            adb.setNegativeButton("Cancel", null);
            adb.setPositiveButton("Ok", new AlertDialog.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    MyDataObject.remove(positionToRemove);
                    adapter.notifyDataSetChanged();
                }});
            adb.show();
            }
        });
    

    【讨论】:

    • MyDataObject 将是您的最终后备存储。大多数时候,您不仅想从 DISPLAYED 中删除项目,还想从某个数据库、某个服务器或某个文件存储中删除它们。 Esharp 只是提醒您,除了将其从显示中删除之外,您还需要记住真正删除数据。
    【解决方案2】:

    我想如果你添加下面的代码,它会工作的

    listview.invalidateViews();
    

    要删除一个项目,只需从我们传递给适配器的数组列表中删除该项目并执行listview.invalidateViews();
    这将刷新列表视图

    【讨论】:

      【解决方案3】:

      你可以使用

      adapter.clear() 
      

      这将删除您的第一个适配器的所有项目,然后您可以设置另一个适配器或重用适配器并将项目添加到旧适配器。如果你使用

      adapter.add()
      

      要将数据添加到您的列表中,您无需调用 notifyDataSetChanged

      【讨论】:

      • 从 BaseAdapter 扩展而来的 CustomAdapter 没有 clear()!
      【解决方案4】:
      int count = adapter.getCount();
      for (int i = 0; i < count; i++) {
       adapter.remove(adapter.getItem(i));
      }
      

      然后拨打notifyDataSetChanged();

      【讨论】:

      • 应该是adapter.remove(adapter.getItem(0));
      • adapter.remove(adapter.getItem(0)); 这只会删除第一个元素,但如果您想删除所有元素,请使用我发布的内容..
      • 伊什塔尔的评论是正确的。上面的代码将尝试删除列表末尾之后的项目。列表的每次迭代都会删除一项,因此当 i 等于 (count - 1) 时,您将拥有一个单项列表,并且 getItem(i) 将失败。
      • 你可以用这种方式简单地从头到尾的项目: for (int i = count-1; i >= 0; i--) { adapter.remove(adapter.getItem(i)) ; }
      • IndexOutOfRange 接近。
      【解决方案5】:

      将其从适配器中移除,然后通知数组适配器数据集已更改。

      m_adapter.remove(o);
      m_adapter.notifyDataSetChanged();
      

      【讨论】:

        【解决方案6】:
                    names = db.getSites();
                    la = new ArrayAdapter<String>(EditSiteList.this,
                            android.R.layout.simple_list_item_1, names);
                    EditSiteList.this.setListAdapter(la);
                    listview.invalidateViews();
        

        这段代码对我来说很好。

        【讨论】:

          【解决方案7】:
          • 您应该只使用一个与您需要列出的数据列表绑定的适配器
          • 当您需要删除和替换所有项目时,您必须使用“list.clear()”从数据列表中清除所有项目,然后使用“list.addAll(List)”添加新数据

          这里是一个例子:

          List<String> myList = new ArrayList<String>();
          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,       android.R.layout.simple_list_item_1, myList);
          listview.setAdapter(adapter);
          listview.setOnItemClickListener(this);
          
          populateList(){
             List<String> result = getDataMethods();
          
             myList.addAll(result);
             adapter.notifyDataSetChanged();
          }
          
          repopulateList(){
             List<String> result = getDataMethods();
          
             myList.clear();
             myList.addAll(result);
             adapter.notifyDataSetChanged();
          }
          

          【讨论】:

            【解决方案8】:

            试试这个代码,它对我有用。

            public class Third extends ListActivity {
            private ArrayAdapter<String> adapter;
            private List<String> liste;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_third);
                 String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                            "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                            "Linux", "OS/2" };
                 liste = new ArrayList<String>();
                 Collections.addAll(liste, values);
                 adapter = new ArrayAdapter<String>(this,
                            android.R.layout.simple_list_item_1, liste);
                 setListAdapter(adapter);
            }
             @Override
              protected void onListItemClick(ListView l, View v, int position, long id) {
                 liste.remove(position);
                 adapter.notifyDataSetChanged();
              }
            }
            

            【讨论】:

              【解决方案9】:

              首先,您应该从列表中删除该项目。稍后您可以清空适配器并用新列表重新填充它。

              private void add(final List<Track> trackList) {
                  MyAdapter bindingData = new MyAdapter(MyActivity.this, trackList);
              
                  list = (ListView) findViewById(R.id.my_list); // TODO
              
                  list.setAdapter(bindingData);
              
              
                  // Click event for single list row
                  list.setOnItemClickListener(new OnItemClickListener() {
              
                      public void onItemClick(AdapterView<?> parent, View view,
                              final int position, long id) {
                          // ShowPlacePref(places, position);
                          AlertDialog.Builder showPlace = new AlertDialog.Builder(
                                  Favoriler.this);
                          showPlace.setMessage("Remove from list?");
                          showPlace.setPositiveButton("DELETE", new OnClickListener() {
                              public void onClick(DialogInterface dialog, int which) {    
              
                                  trackList.remove(position); //FIRST OF ALL REMOVE ITEM FROM LIST
                                  list.setAdapter(null); // THEN EMPTY YOUR ADAPTER
              
                                  add(trackList); // AT LAST REFILL YOUR LISTVIEW (Recursively)
              
                              }
              
                          });
                          showPlace.setNegativeButton("CANCEL", new OnClickListener() {
                              public void onClick(DialogInterface dialog, int which) {
              
                              }
                          });
                          showPlace.show();
                      }
              
                  });
              
              }
              

              【讨论】:

                【解决方案10】:

                这很简单。首先你应该清除你的收藏,然后像下面的代码一样清除列表:

                 yourCollection.clear();
                 setListAdapter(null);
                

                【讨论】:

                  【解决方案11】:

                  您还可以使用 listView.setOnItemLongClickListener 删除选定的项目。 下面是代码。

                  // listView = 您的 ListView 的名称

                    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                          @Override
                          public boolean onItemLongClick(AdapterView<?> parent, View view, int 
                          position, long id) {
                  
                          // it will get the position of selected item from the ListView
                  
                  final int selected_item = position;
                  
                              new AlertDialog.Builder(MainActivity.this).
                                      setIcon(android.R.drawable.ic_delete)
                                      .setTitle("Are you sure...")
                                      .setMessage("Do you want to delete the selected item..?")
                                      .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                          @Override
                                          public void onClick(DialogInterface dialog, int which)
                                          {
                                              list.remove(selected_item);
                                              arrayAdapter.notifyDataSetChanged();
                                          }
                                      })
                                      .setNegativeButton("No" , null).show();
                  
                              return true;
                          }
                      });
                  

                  【讨论】:

                    【解决方案12】:

                    //试试这个:

                    字符串文本 = ((TextView) 视图).getText().toString();
                    适配器.删除(文本);

                    【讨论】:

                      猜你喜欢
                      • 2012-06-22
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-03-04
                      • 1970-01-01
                      • 1970-01-01
                      • 2010-11-22
                      • 2023-03-18
                      相关资源
                      最近更新 更多