【问题标题】:Save SharePreference string to a ListView将 SharedPreferences 字符串保存到 ListView
【发布时间】:2017-12-26 04:10:11
【问题描述】:

我有两个活动。假设“A”和“B”,活动“A”有一个名为“Get”的按钮,每次单击后都会生成一个新字符串,并一次显示一个。活动“A”还有一个“发送”按钮,它将生成的字符串发送到另一个活动“B”。当活动“B”接收到数据时,它必须将数据填充到 ListView 中。

下面是简单的机器步骤:

In Activity "A"
1 - Generate 1 string by pressing the generate button
2 - text will be displayed in textView
3 - "send" button will send the text from textView to another activity "B" ( I'm using sharedPreference)

In Activity "B"
4 - receive the data sent by Activity "A" ( I'm using sharedPreference)
5 - populate string into a listview
6 - go to step 1 again.  

我的麻烦是,每当我单击发送按钮时,它都会将字符串发送到活动“B”,但是当我再次执行相同的任务时,它只会填充最后生成的字符串。换句话说,我的代码只填充了一个字符串。

到目前为止,我已经尝试过以下代码,我们将不胜感激。

@Override
    public void onClick(View view) {


        switch(view.getId()) {
            case R.id.generateButton:
                generateString();
                break;

            case R.id.send:

                //displayText is a textView
                String text = displayText.getText().toString(); 

                // data sharing using sharedPref
                SharedPreferences.Editor editor = getApplicationContext().getSharedPreferences("lado", MODE_PRIVATE).edit();
                editor.putString("mug",text);
                editor.apply();
                break;


        }

---------

活动 B

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

        SharedPreferences prefs = getSharedPreferences("lado", MODE_PRIVATE);
        final String text = prefs.getString("mug", "No name defined");

       String[] list = new String[]{name};


        // Create a List from String Array elements
        final List<String> fav_list = new ArrayList<>(Arrays.asList(list));



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

        // Assign adapter to ListView
        textList.setAdapter(adapter);

【问题讨论】:

  • 请给我看你的完整代码并解释你想要什么:)
  • 在共享首选项中使用相同的键将覆盖您以前的值,因此请保留一个列表或数组以在共享首选项中存储一组值。

标签: java android sharedpreferences


【解决方案1】:

我不会为此使用共享首选项,而是将列表作为附加项传递给 A 活动的意图。像这样的:

List<String> list = new ArrayList<String>();
list.add("hello");
list.add("good");
list.add("bye");
JSONArray array = new JSONArray(list);
Intent goToNextActivity = new Intent(getApplicationContext(), YourActivity.class);
goToNextActivity.putExtra("words", array.toString());
startActivity(goToNextActivity);

然后在 B 活动中你可以访问这些数据:

String words = getIntent().getStringExtra("words");
JSONArray array = new JSONArray(words);

【讨论】:

  • 对不起,我想你误解了,但是,我想将字符串数据从活动“A”发送到“B”,然后将字符串填充到活动B中的ListView中。记住会有在活动“A”中一次只生成一个字符串。应该通过一一按下“发送”按钮将该字符串填充到活动“B”中。
  • 请看我更新的问题,非常感谢!! :)
  • @user7062312b 你的要求对我来说毫无意义。 Activity B 在实际加载之前并不“知道”发送给它的内容。那时,它醒来并在概念上看到一堆字符串。他们是否一一进来是无关紧要的(如果不是,那么你应该解释为什么不)。
【解决方案2】:

添加以下模型:

Dictionary.java

class Dictionary implements Serializable {
    private List<Words> wordsList = new ArrayList<>();


    List<Words> getWordsList() {
        return wordsList;
    }

    void setWordsList(List<Words> wordsList) {
        this.wordsList = wordsList;
    }
}

Words.java

public class Words implements Serializable {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

活动 A

@Override
    public void onClick(View view) {


        switch(view.getId()) {
            case R.id.generateButton:
                generateString();
                break;

            case R.id.send:

                //displayText is a textView
                String text = generateButton.getText().toString(); 

               SharedPreferences pref = this.getSharedPreferences("lado", Context.MODE_PRIVATE);



                Words words = new Words();
                words.setName(text);
                List<Words> wordsList = new ArrayList<>();

                Gson gson = new Gson();
                Dictionary dictionary = gson.fromJson(pref.getString("word", ""), Dictionary.class);
                if (dictionary != null && dictionary.getWordsList() != null) {
                    wordsList.addAll(dictionary.getWordsList());
                    dictionary.setWordsList(wordsList);
                    wordsList.add(words);
                } else {
                    dictionary = new Dictionary();
                    wordsList.add(words);
                    dictionary.setWordsList(wordsList);
                }
                SharedPreferences.Editor editor = pref.edit();
                editor.putString("word", new Gson().toJson(dictionary));
                editor.commit();

                break;


        }

活动 B

SharedPreferences pref = getSharedPreferences("lado", MODE_PRIVATE);

 List<String> list = new ArrayList<>();
Gson gson = new Gson();
Dictionary dictionary = gson.fromJson(pref.getString("word", ""), Dictionary.class);
if (dictionary != null)
    for (Words words : dictionary.getWordsList()) {
        list.add(words.getName());
    }
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, android.R.id.text1, list);

// Assign adapter to ListView
textList.setAdapter(adapter);

//**Remove when click on item**
textList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Gson gson = new Gson();
        Dictionary dictionary = gson.fromJson(pref.getString("word", ""), Dictionary.class);
        for (Words words :
                dictionary.getWordsList()) {
            if (words.getName().equalsIgnoreCase(list.get(i))) {
                dictionary.getWordsList().remove(words);
                list.remove(i);
                break;
            }
        }
        SharedPreferences.Editor editor = pref.edit();
        editor.putString("word", new Gson().toJson(dictionary));
        editor.commit();

        adapter.notifyDataSetChanged();
    }
});

【讨论】:

  • 对不起,我想你误解了,但是,我想将字符串数据从活动“A”发送到“B”,然后将字符串填充到活动B中的ListView中。记住会有在活动“A”中一次只生成一个字符串。应该通过一个一个按“发送”按钮将一个字符串填充到活动“B”中
  • 请看我更新的问题,非常感谢!! :)
  • 我在玩代码,我想知道如果我想完全删除列表视图,我该如何处理。我尝试了“adapter.remove()”,但它只会擦除视图,当我重新打开应用程序时,数据会显示出来。再次感谢。
【解决方案3】:

您可以使用以下解决方案

    @Override
public void onClick(View view) {


    switch(view.getId()) {
        case R.id.generateButton:
            //declare a public list
            list.add(generateString());
            break;

        case R.id.send:

            //displayText is a textView
            JSONArray data=new JSONArray(list);

            // data sharing using sharedPref
            SharedPreferences.Editor editor = getApplicationContext().getSharedPreferences("lado", MODE_PRIVATE).edit();
            editor.putString("mug",data.toString());
            editor.apply();
            break;


    }

活动 B

    ListView textList = (ListView) findViewById(R.id.list);
    // receiving data from MapsActivity
    SharedPreferences prefs = getSharedPreferences("lado", MODE_PRIVATE);
    final String text = prefs.getString("mug", "No name defined");

    JSONArray data=new JSONArray(text);


    // Create a List from String Array elements
    final List<String> fav_list = new ArrayList<>();


     if (data != null) { 
      for (int i=0;i<data.length();i++){ 
         fav_list.add(data.getString(i));
      } 
     } 



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

    // Assign adapter to ListView
    textList.setAdapter(adapter);

【讨论】:

  • 请看我更新的问题,非常感谢!! :)
猜你喜欢
  • 2017-10-15
  • 1970-01-01
  • 2014-12-25
  • 2018-08-08
  • 1970-01-01
  • 2015-04-06
  • 2011-10-26
相关资源
最近更新 更多