【问题标题】:Why is the item not removed from the adapter?为什么该项目没有从适配器中删除?
【发布时间】:2015-08-27 04:39:52
【问题描述】:

我正在尝试从适配器中删除一个项目。单击屏幕上的删除图标时出现异常。

这是我的代码:

public class MainApplication extends Activity {

    String name[] = {"naveen","parveen","deepak"};
    String item;
    Object mActionMode;

    private ArrayAdapter arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_application);
        ListView listView = (ListView) findViewById(R.id.list_view);
        arrayAdapter = new ArrayAdapter(this,
                android.R.layout.simple_list_item_1, name);
        listView.setAdapter(arrayAdapter);
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                item = name[position];
                if(mActionMode!=null){
                    return  false;
                }
                mActionMode = MainApplication.this.startActionMode(mactionMode);
                return true;
            }
        });


    }
    private ActionMode.Callback mactionMode = new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.setTitle(item);
            MenuInflater menuInflater = mode.getMenuInflater();
            menuInflater.inflate(R.menu.menu,menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {

            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem ite) {
            Toast.makeText(getApplicationContext(),"HH",Toast.LENGTH_LONG).show();
            switch (ite.getItemId()){
                case R.id.detlte_item :
                    arrayAdapter.remove(item);
                    arrayAdapter.notifyDataSetChanged();
                    mode.finish();
                    return  true;
                default:
                    return false;

            }
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            mActionMode = null;
        }
    };

}

我在onActionItemClicked 的这些行中遇到错误:

 arrayAdapter.remove(item);
 arrayAdapter.notifyDataSetChanged();
 mode.finish();

为什么会出现这个错误?

08-27 10:09:35.621  16245-16245/com.example.naveen.listviewapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.naveen.listviewapp, PID: 16245
    java.lang.UnsupportedOperationException
            at java.util.AbstractList.remove(AbstractList.java:638)
            at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:75)
            at java.util.AbstractCollection.remove(AbstractCollection.java:229)
            at android.widget.ArrayAdapter.remove(ArrayAdapter.java:244)
            at com.example.naveen.listviewapp.MainApplication$2.onActionItemClicked(MainApplication.java:65)
            at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onActionItemClicked(PhoneWindow.java:2755)
            at com.android.internal.view.StandaloneActionMode.onMenuItemSelected(StandaloneActionMode.java:133)
            at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:741)
            at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
            at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:884)
            at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
            at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:546)
            at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115)
            at android.view.View.performClick(View.java:4456)
            at android.view.View$PerformClick.run(View.java:18465)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 尝试使用ArrayList 而不是String[]..
  • 而不是将其从适配器中删除。你需要从你的数组中删除它
  • 您是否尝试将您的 String name[] 更改为 ArrayList?允许像 remove 这样的操作在静态数组中不可用

标签: android android-layout android-fragments android-listview


【解决方案1】:

您已经使用纯 Java 数组(例如,String[])初始化了适配器。尝试使用实现 java.util.List 接口的东西(例如 ArrayList)。

【讨论】:

    【解决方案2】:

    我认为这是因为您使用的是固定大小的数组。您应该使用 ArrayList。 将名称类型更改为ArrayList&lt;String&gt;

       private ArrayList<String> name;
    

    在你的代码中添加这个函数。

    private ArrayList<String> getItems() {
     name = new ArrayList<String>();
     name.add("naveen");
     name.add("parveen");
     name.add("deepak");
     return name;
    }
    

    onCreate

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listview_application);
    
            name = getItems();
            ... //remaining code
            }
    

    【讨论】:

      【解决方案3】:

      您的String item 不能转换为ArrayAdapter 项目。您需要从 Array 源中删除项目。

      name= ArrayUtils.removeElement(name,item);
      arrayAdapter.notifyDataSetChanged();
      mode.finish();
      

      【讨论】:

        猜你喜欢
        • 2017-09-06
        • 2021-03-03
        • 1970-01-01
        • 2020-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多