【问题标题】:data not being inserted into ListView dynamically数据未动态插入 ListView
【发布时间】:2017-12-28 05:46:04
【问题描述】:

我有一个问题,我有一个按钮,它本质上是一个“收藏夹”按钮,它保存来自 webview sesson 的 URL 并将其添加到另一个名为收藏夹的类中的列表视图中。由于找不到更好的方法,它通过共享偏好来做到这一点。我遇到的问题是,当我尝试保存另一个 URL 时,它只会覆盖当前存在的 URL,而不会添加另一行。我的带有按钮的 webview 代码是:

    @Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_share) {
        shareURL();
        Toast.makeText(this, getString(R.string.share),
                Toast.LENGTH_SHORT).show();
    }
    if (id == R.id.action_favorite) {
        changeIcon();

        Snackbar.make(findViewById(android.R.id.content), "Saved for later", Snackbar.LENGTH_LONG).show();

        String url = getIntent().getDataString();

        SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
        SharedPreferences.Editor edit = prefs.edit();
        edit.putString("URL", url );
        edit.apply();

    }
    return super.onOptionsItemSelected(item);
}

// 我的“收藏夹”类的代码如下:

    //LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS
ArrayList<String> listItems = new ArrayList<String>();

//DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW
ArrayAdapter<String> adapter;

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

    ListView listView = (ListView) findViewById(R.id.favoritesList);

    adapter = new ArrayAdapter<String>(this,
            R.layout.custom_lv,
            listItems);
    listView.setAdapter(adapter);

    SharedPreferences bb = getSharedPreferences("my_prefs", 0);
    String m = bb.getString("URL", "");

    listItems.add(m);
    adapter.notifyDataSetChanged();

}

任何帮助将不胜感激!

--- 编辑 --

使用 FnR 的代码,它仍然只是在收藏夹列表视图中添加最新的“已保存”url,更新的代码如下:

--收藏代码--

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

    ListView listView = (ListView) findViewById(R.id.favoritesList);

    adapter = new ArrayAdapter<String>(this,
            R.layout.custom_lv,
            listItems);
    listView.setAdapter(adapter);

    getListFromSharedPreferences();

}

private List<String> getListFromSharedPreferences() {
    SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
    Set<String> set = prefs.getStringSet("URL", null);
    List<String> urlList = new ArrayList<>();
    if (set != null) {
        urlList = new ArrayList<>(set);
        listItems.add(String.valueOf(set));
        adapter.notifyDataSetChanged();
    }
    Log.e("size",urlList.size()+"");
    return urlList;
}

-- 网页视图代码--

    @Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_share) {
        shareURL();
        Toast.makeText(this, getString(R.string.share),
                Toast.LENGTH_SHORT).show();
    }
    if (id == R.id.action_favorite) {
        changeIcon();

        Snackbar.make(findViewById(android.R.id.content), "Saved for later", Snackbar.LENGTH_LONG).show();

        String url = getIntent().getDataString();

        putSharedPreferences(url);

    }
    return super.onOptionsItemSelected(item);
}

private void putSharedPreferences(String url) {
    SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
    SharedPreferences.Editor edit = prefs.edit();
    Set<String> set = prefs.getStringSet("URL", null);
    if (set != null) {
        set.add(url);
        edit.putStringSet("URL", set);
        edit.apply();
    }
}

【问题讨论】:

  • 你能把你的活动课填满吗?
  • 我的活动课满了?
  • 是的。所有活动

标签: android listview sharedpreferences android-arrayadapter


【解决方案1】:

您使用的是相同的 SharedPreferences 键,这意味着当您添加新 url 时,您将覆盖现有的 url。您需要将 url 存储在列表中。为此,您可以使用 SharedPreferences.Editor.putStringSet。例子在这里 Save ArrayList to SharedPreferences

  private void putSharedPreferences(String url) {
    SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
   SharedPreferences.Editor edit = prefs.edit();
    Set<String> set = prefs.getStringSet("key", null);
    if (set != null) {
        set.add(url);
        edit.putStringSet("key", set);
        edit.apply();
    }
}

private List<String> getListFromSharedPreferences() {
    SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
    Set<String> set = prefs.getStringSet("key", null);
    List<String> urlList = new ArrayList<>();
    if (set != null) {
        urlList = new ArrayList<>(set);
    }
    Log.e("size",urlList.size()+"");
    return urlList;
}

【讨论】:

  • 道歉,我不是 100% 确定该做什么。 @FnR
  • 好的,我已经添加了您在上面放置的内容,但它仍然只显示最新保存的 webview。不知道出了什么问题。将代码添加到我的问题中。
【解决方案2】:

您需要做的是在添加到 SharedPreference 之前将之前保存的 URL 添加到新 Set。

private void putSharedPreferences(String url) {
  SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
  SharedPreferences.Editor edit = prefs.edit();
  Set<String> previousSet = prefs.getStringSet("key", null);
  Set<String> set = new HashSet<>();
  if (previousSet != null) {
    set.addAll(previousSet);
  }
  set.add(url);
  edit.putStringSet("key", set);
  edit.apply();
 }
}

将所有以前保存的数据添加到新的 HashSet 背后的原因是修改返回的实例并不能保证数据的一致性,或者根本没有修改。更多解释可以看documentation here

【讨论】:

  • 我应该把它放在哪里?
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多