【问题标题】:List can't be saved or loaded无法保存或加载列表
【发布时间】:2021-02-26 20:54:21
【问题描述】:

我尝试制作一个动态列表,用户可以在其中通过编写文本和按下按钮来添加元素。用户还应该能够通过长时间单击来删除元素。 所有这些都工作正常,但是每次我关闭应用程序时,创建的列表都消失了。我不确定究竟是什么失败了,无论是加载还是保存。 这是我的代码:

public class MainActivity extends AppCompatActivity {


    private ArrayList<String> ModuleList;
    private ArrayAdapter<String> MyAdapter;
    private ListView listView;
    private Button addButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        loadData();

        addButton=findViewById(R.id.btnPlus);
        MyAdapter=new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
        listView=findViewById(R.id.listView);
        listView.setAdapter(MyAdapter);

        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                addModule(view);
                saveData();
            }
        });

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
        {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
            {
                deleteItem(view, position);
                saveData();
                return true;
            }
        });

    }

    private void addModule(View view) {
        EditText input =findViewById(R.id.textInput);
        String itemText=input.getText().toString();

        if(!(itemText.equals("")))
        {
            ModuleList.add(itemText);
            MyAdapter.add(itemText);
            MyAdapter.notifyDataSetChanged();
            input.setText("");
        }
        else
        {
            Toast.makeText(getApplicationContext(),"Please insert Module...",Toast.LENGTH_LONG).show();
        }
    }

    private void deleteItem(View view,int i)
    {
        Context context = getApplicationContext();
        MyAdapter.remove(ModuleList.get(i));
        ModuleList.remove(i);
        MyAdapter.notifyDataSetChanged();
        Toast.makeText(context, "Item Removed", Toast.LENGTH_LONG).show();
    }

    private void saveData()
    {
        SharedPreferences sharedPreferences=getSharedPreferences("Shared preferences",MODE_PRIVATE);
        SharedPreferences.Editor editor=sharedPreferences.edit();
        Gson gson=new Gson();
        String json=gson.toJson(ModuleList);
        editor.putString("Task List",json);
        editor.apply();
    }

    private void loadData()
    {
        SharedPreferences sharedPreferences=getSharedPreferences("Shared preferences",MODE_PRIVATE);
        Gson gson=new Gson();
        String json=sharedPreferences.getString("Task List",null);
        Type type= new TypeToken<ArrayList<String>>() {}.getType();
        ModuleList=gson.fromJson(json,type);

        if(ModuleList==null){
            ModuleList=new ArrayList<>();
        }
    }
}

我看不出我的错误,但我对这一切都很陌生。所以可能有一些明显的缺失。

非常感谢。

【问题讨论】:

    标签: android json android-studio


    【解决方案1】:

    我曾经遇到过同样的问题,解决办法是

    而不是

        SharedPreferences sharedPreferences=getSharedPreferences("Shared preferences",MODE_PRIVATE);
    

    写(去掉名字中的空格)

         SharedPreferences sharedPreferences=getSharedPreferences("Sharedpreferences",MODE_PRIVATE);
    

    与你的变量名类似

     editor.putString("TaskList",json);
     String json=sharedPreferences.getString("TaskList",null);
    

    我不知道这是否是你的情况,或者为什么会发生这种情况,因为变量是一个字符串,空格无关紧要,但对我来说,如果名称有空格,它永远不允许我在 sharedPrefs 中保存任何内容

    然后检查这一行

      MyAdapter=new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
    

    用这个更新它

     MyAdapter=new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,ModuleList);
    

    对于保存项目两次的问题,问题就在这里

      if(!(itemText.equals("")))
        {
            ModuleList.add(itemText);
           // MyAdapter.add(itemText); remove this line the itemText is already added to the moduleList
            MyAdapter.notifyDataSetChanged();
            input.setText("");
        }
    

    【讨论】:

    • 感谢您的回复,我试过了。但不幸的是,一旦我关闭应用程序,我列表中所有添加的项目都消失了。
    • 再次检查答案我编辑了它,看来您还没有选择应该附加到适配器的 Arraylist
    • 嘿,谢谢。所以:它现在保存。太棒了......但现在它以某种方式创建了每个列表项两次。虽然我可以很好地删除第一个列表项,但当我尝试删除第二个项目时,应用程序崩溃了。
    • 我再次编辑了多项目问题尝试修复并回复我
    • 删除问题也一样,您只需从 ModuleList 中删除项目并通知适配器不要对适配器本身执行任何操作
    【解决方案2】:

    首先:创建一个静态最终变量来存储“任务列表”,然后添加一些 Log.d("TEST", variable) 以在“Logcat”中显示感兴趣的变量,然后请更新问题。

    【讨论】:

    • 我按照你说的做了,因为 Log.d 不希望有一个列表,所以我使用了一个列表条目。它说:D / TEST:vhhshd并给我一个警报:runtime_flags中设置的未知位:0x8000。 W/Gralloc3: mapper 3.x is not supported 也说
    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多