在Android上保存ListView布局?

时间:2014-05-21 03:27:17

标签: android android-listview

我有一个ListView包含MainActivity中来自RSS Feed的新闻,问题是每次打开应用时都必须流式传输RSS Feed,因为ListView的项目已被销毁当我关闭应用程序时。

我知道我可以暂时将其保存在SQLite中,但是有一种更简单的方法来保存ListView布局,以便下次打开应用程序时它仍然存在吗?

3 个答案:

答案 0 :(得分:0)

我认为建议无论如何都要将数据保存在数据库中。 但是你有另一种保存方式,它在SharedPrefernces中。 我不认为这实际上是最简单的方式......

答案 1 :(得分:0)

嗯,我会使用Volley库来缓存请求,我想这很简单:你做请求,下次首先从缓存中获取它。您不必明确保存和描述用于存储此案例数据的模型。

下面,我举了一个示例:

public class RSSProvider {

    private final RequestQueue mRequestQueue;

    // ...

    private RSSProvider(Context context) {
        mRequestQueue = Volley.newRequestQueue(context.getApplicationContext());
    }

    // ...

    public void getSomething(final Response.Listener<String> responseListener, final Response.ErrorListener errorListener) {
        if (mRequestQueue.getCache().get(<URL>) != null) {
            responseListener.onResponse(new String(mRequestQueue.getCache().get(<URL>).data));
        } else {
            StringRequest request = new StringRequest(Request.Method.GET, <URL>, responseListener, errorListener);
            request.setShouldCache(true);
            mRequestQueue.add(request);
        }
    }

    // ...

}

答案 2 :(得分:0)

另一种选择是使用SharePreferences和Gson将列表视图的数据源转换为存储字符串,然后在重新打开应用程序时,您可以非常快速地使用存储的数据重建列表视图。我在一个应用程序中执行类似操作,其中列表视图的数据源是LinkedHashMap项的ArrayList,因此这将是将ArrayList转换为String然后在需要时返回到ArrayList的两种方法

public static String ArrayListToString(ArrayList<LinkedHashMap> list) {
    return gson.toJson(list);
}

public static ArrayList<LinkedHashMap> StringToArrayList(String input) {
    Type collectiontype = new TypeToken<ArrayList<LinkedHashMap>>(){}.getType();
    ArrayList<LinkedHashMap> list = gson.fromJson(input, collectiontype );
    return list;
}

我还建议存储时间戳,以便检查是否应显示存储的列表或是否需要检索更新的列表

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView = (ListView)findViewById(R.id.clientListView)
    ...whatever other setup you want to do here
    CheckTimeStamp();
    }

      public static void CheckTimeStamp() {
    String timeStamp = preferences.getString("keyClientTimeStamp", "");
    Calendar calendar = Calendar.getInstance();
    Date date = calendar.getTime();
    String currentTime = HelperClass.GetSimpleDateFormat(date);
    if (currentTime.equals(timeStamp)) {
        String storedString = preferences.getString("keyStoredClients", "");
        clientArrayList = HelperClass.StringToArrayList(decryptedArray);
        //the setupView method is where I take my ArrayList 
        //and add it to my ListView's Adapter
        SetupView();
    }
    else {
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(Constants.keySalesTimeStamp, currentTime);
        editor.apply();
        //for me this is a web service that get's a list of clients, 
        //converts that list to a String to store in SharedPreferences 
        //and then calls SetupView() to add the list to the ListView Adapter
        GetClientList();
    }
}