【问题标题】:Unable to modify values in ListView无法修改 ListView 中的值
【发布时间】:2015-06-10 17:44:27
【问题描述】:

我遇到了这个问题

java.lang.UnsupportedOperationException

我想做的很简单,我给你举个例子。

我的列表

蓝色
红色
绿色

当我在Green 上创建OnItemLongClickListener() 时,我的列表应如下所示:

我的列表

绿色

我试过的是

final ArrayAdapter < String > adapter = new ArrayAdapter < String > (getActivity(), android.R.layout.simple_list_item_1, FileBackup.getFilesFound());
adapter.setNotifyOnChange(true);
lv.setAdapter(adapter);
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView <? > arg0, View arg1, final int arg2, long arg3) {
        String itemValue = (String) lv.getItemAtPosition(arg2);
        Log.d("Item clicked --> ", lv.getItemAtPosition(arg2).toString());
        FileBackup.setNameFile(itemValue);
        final Dialog dialog = new Dialog(getActivity());
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.user_file_choose);
        Button button = (Button) dialog.findViewById(R.id.btOk);
        Button button2 = (Button) dialog.findViewById(R.id.btKo);
        TextView tvBackUpFile = (TextView) dialog.findViewById(R.id.textViewContentDialog);
        tvBackUpFile.setText("Do you want to backup " + FileBackup.getNameFile() + " ?");
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                dialog.dismiss();
                //Clear all the ListView
                lv.setAdapter(null);

            }
        });
    }
});

如果我想清除ListView,它工作正常,但在我的情况下我不想这样做,我尝试添加或删除项目:

adapter.addAll("Something");

lv.removeViewAt(2);

然后拨打adapter.notifyDataSetChanged();,但每次我尝试时都会出现同样的错误。

我做错了什么?

编辑

现在代码看起来像:

final ArrayAdapter < String > adapter = new ArrayAdapter < String > (getActivity(), Arrays.asList(FileBackup.getFilesFound()));
adapter.setNotifyOnChange(true);
lv.setAdapter(adapter);
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView <? > arg0, View arg1, final int arg2, long arg3) {
        String itemValue = (String) lv.getItemAtPosition(arg2);
        Log.d("Item clicked --> ", lv.getItemAtPosition(arg2).toString());
        FileBackup.setNameFile(itemValue);
        final Dialog dialog = new Dialog(getActivity());
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.user_file_choose);
        Button button = (Button) dialog.findViewById(R.id.btOk);
        Button button2 = (Button) dialog.findViewById(R.id.btKo);
        TextView tvBackUpFile = (TextView) dialog.findViewById(R.id.textViewContentDialog);
        tvBackUpFile.setText("Do you want to backup " + FileBackup.getNameFile() + " ?");
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                dialog.dismiss();
                //Clear all the ListView
                lv.setAdapter(null);
                //Trying to add that current item clicked
                adapter.addAll(FileBackup.getNameFile());
                adapter.notifyDataSetChanged();

            }
        });
    }
});

这是 LogCat 错误:

06-10 20:14:43.531    8072-8072/info.androidhive.tabsswipe E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: info.androidhive.tabsswipe, PID: 8072
java.lang.UnsupportedOperationException
        at java.util.AbstractList.add(AbstractList.java:404)
        at java.util.AbstractList.add(AbstractList.java:425)
        at java.util.Collections.addAll(Collections.java:2583)
        at android.widget.ArrayAdapter.addAll(ArrayAdapter.java:211)
        at info.androidhive.tabsswipe.BackupWA$1$1.onClick(BackupWA.java:80)
        at android.view.View.performClick(View.java:4456)
        at android.view.View$PerformClick.run(View.java:18462)
        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:5102)
        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)

它指向这个 --> adapter.addAll(FileBackup.getNameFile()); 但它不为空我也尝试过adapter.addAll("RED");

编辑2

我正在尝试保留我点击到 FileBackup.getFilesFound() 的名称,这样我就可以再次创建我的适配器了:

String[] itemvalues = (String[]) lv.getItemAtPosition(arg2);
FileBackup.setFilesFound(itemvalues);

然后我在做:

 adapter.addAll(Arrays.asList(FileBackup.getFilesFound()));
 //Add the name
 adapter.notifyDataSetChanged();

我的班级被声明为String[],错误是:

java.lang.ClassCastException:java.lang.String 无法转换为 java.lang.String[]

EDIT3

每次我想更新列表时都会出现相同的错误...@Y.S.说最好把我所有的代码都贴出来看看发生了什么,因为我在某处使用String[]而不是ArrayList&lt;String&gt;

那是我的FileBackup.java

    public class FileBackup {

    private String path;
    private String pathFile;
    private File FileToBackUp;
    private String SDpath;
    private String[] FilesFound;
    private String nameFile;

    public String getPathFile() {
        return pathFile;
    }

    public void setPathFile(String pathFile) {
        this.pathFile = pathFile;
    }
    public String getNameFile() {
        return nameFile;
    }

    public void setNameFile(String nameFile) {
        this.nameFile = nameFile;
    }

    public FileBackup(String path){
        this.path = path;
    }

    public File getFileToBackUp() {
        return FileToBackUp;
    }

    public void setFileToBackUp(File fileToBackUp) {
        FileToBackUp = fileToBackUp;
    }
public String[] getFilesFound() {
       this.FilesFound = FilesFound();

        return FilesFound;
    }
 public String[] FilesFound() {
        File dir = new File(this.path);
        File[] filelist = dir.listFiles();
        String[] theNamesOfFiles = new String[filelist.length];
        for (int i = 0; i < theNamesOfFiles.length; i++) {

            theNamesOfFiles[i] = filelist[i].getName();
        }

        return theNamesOfFiles;
    }

这就是我拥有文件列表的方式。

final String itemValue = (String) lv.getItemAtPosition(arg2);

 Log.d("Item clicked --> ", lv.getItemAtPosition(arg2).toString());


 final Dialog dialog = new Dialog(getActivity());
 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
 dialog.setContentView(R.layout.user_file_choose);
 Button button = (Button) dialog.findViewById(R.id.btOk);
 Button button2 = (Button) dialog.findViewById(R.id.btKo);
 FileBackup.setNameFile(itemValue);
 TextView tvBackUpFile = (TextView) dialog.findViewById(R.id.textViewContentDialog);
 tvBackUpFile.setText("Do you want to backup " + FileBackup.getNameFile() + " ?");
 button.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
         //The complete path of the fail
         FileBackup.setPathFile(GlobalConstant.path + "/" + FileBackup.getNameFile());
         //Converting the path of the file to a File and putting it to FileToBackUp
         FileBackup.setFileToBackUp(PathToFile(FileBackup.getPathFile()));

         dialog.dismiss();
         //Clear all the ListView
         lv.setAdapter(null);

         //Add the name
         BackUpFile.setEnabled(true);


     }
 });

我试图做类似的事情:

button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        //The complete path of the fail
        FileBackup.setPathFile(GlobalConstant.path + "/" + FileBackup.getNameFile());
        //Converting the path of the file to a File and putting it to FileToBackUp
        FileBackup.setFileToBackUp(PathToFile(FileBackup.getPathFile()));
        ///// THIS IS NEW ///////////
        String itemvalues = (String) lv.getItemAtPosition(arg2);
        FileBackup.setFilesFound(new String[] {
            itemvalues
        });
        adapter.addAll(FileBackup.getFilesFound());
        //Add the name
        adapter.notifyDataSetChanged();
        //////////TIL HERE/////////////
        dialog.dismiss();
        //Clear all the ListView


        //Add the name
        BackUpFile.setEnabled(true);


    }
});

这就是 LogCat

 java.lang.UnsupportedOperationException
        at java.util.AbstractList.add(AbstractList.java:404)
        at java.util.AbstractList.add(AbstractList.java:425)
        at java.util.AbstractCollection.addAll(AbstractCollection.java:76)
        at android.widget.ArrayAdapter.addAll(ArrayAdapter.java:195)
        at info.androidhive.tabsswipe.BackupWA$1$1.onClick(BackupWA.java:88)
        at android.view.View.performClick(View.java:4456)
        at android.view.View$PerformClick.run(View.java:18462)
        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:5102)
        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)

指向哪里

adapter.addAll(Arrays.asList(FileBackup.getFilesFound()));

我也试过

adapter.addAll(FileBackup.getFilesFound());

但它给出了同样的错误......也许是我在不正确的地方这样做......

【问题讨论】:

  • 位置 2 可能没有视图
  • 这只是一个例子,是的,因为我可以看到 ListView
  • 能否请您发布错误的完整堆栈跟踪以及代码 sn-p 的行号?
  • @matt5784 我的编辑完成
  • 你找到这个问题的解决方案了吗?

标签: java android android-listview android-arrayadapter android-adapter


【解决方案1】:

看看这个答案: ArrayAdapter

所以基本上就像这个答案所说的那样:“ArrayAdapter 在被数组初始化后,会将数组转换为无法修改的 AbstractList(列表)。”

所以很简单,创建自己的 ArrayList,在您的类型为 String 的情况下,然后将其分配给 CustomAdapter,然后您可以从 ArrayList 中删除项目,并且 notifyDataSetChanged() 应该可以工作。

问候

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多