【问题标题】:Problem with Android ListView after Items are removed删除项目后 Android ListView 出现问题
【发布时间】:2010-11-09 05:48:18
【问题描述】:

我似乎遇到了 Android ListView 的问题。我正在尝试从 ListView 中删除所选项目。删除方法正在工作,并且允许我根据需要从列表中删除尽可能多的项目,但是每当我滚动到列表底部时(在删除至少 1 个项目之后),我都会收到一个关闭应用程序的错误。

这是我的代码:

public class MainActivity extends Activity {

   private String[] mRoute;

   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     mRoute = getResources().getStringArray(R.array.countries);

     ListView list = (ListView)findViewById(R.id.list);

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem,     mRoute);

     list.setAdapter(adapter);

     registerForContextMenu(list);
  }

  @Override
  public boolean onContextItemSelected(MenuItem item) {

        AdapterView.AdapterContextMenuInfo info  (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
        int menuItemIndex = item.getItemId();
        String[] menuItems = getResources().getStringArray(R.array.menu);
        String menuItemName = menuItems[menuItemIndex];
        String listItemName = mRoute[info.position];

        // Remove String From List  
        List<String> routeArrayString = new ArrayList<String>(Arrays.asList(mRoute));
    routeArrayString.remove(listItemName);
    mRoute = routeArrayString.toArray(mRoute);

        //Generate new ListView
        ListView list = (ListView)findViewById(R.id.list);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, mRoute);
    list.setAdapter(adapter);   
    registerForContextMenu(list);

        return true;

        }

有什么想法吗?提前致谢。

【问题讨论】:

  • 使用 logcat 向我们展示错误消息的完整堆栈跟踪。

标签: android listview


【解决方案1】:

会发生什么错误?无论如何,您的代码有点难看,应该以另一种方式编写。您应该使用您的适配器,因为它就像您的 ListView 和实际数据之间的桥梁。 BasicAdapter 有特殊的方法来通知数据的变化,只需继承你自己的适配器并直接通过适配器操作数据。

【讨论】:

【解决方案2】:

我认为向适配器中的数组添加项目是问题所在。

public class MainActivity extends ListActivity {

    private ArrayAdapter<String> dataAdapter;
    private static final int REMOVE_ITEM = 1;

    private String[] mRoute = {"One", "Two", "Three", "Four", "Five"};

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        dataAdapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.itemName);

        for (int i = 0; i < mRoute.length; i++) {
             dataAdapter.add(mRoute[i]);
        }

        setListAdapter(dataAdapter);


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        Resources resource = getApplicationContext().getResources();
        menu.add(Menu.NONE,REMOVE_ITEM, REMOVE_ITEM, "REMOVE ITEM");

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
        case REMOVE_ITEM:
            dataAdapter.remove(dataAdapter.getItem(dataAdapter.getCount() - 1));
            break;
        }
        return false;
    }


}

有效!

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多