使用URL中的JSON数据加载ListView

时间:2014-07-29 05:51:43

标签: android json android-listview android-asynctask

我有以下情况:

  • 我开发了一个Android应用程序,它在MainActivity中有一个ListView
  • 用于填充ListView的数据来自返回JSON数据的URL
  • 我想尽可能“缓存”ListView项目(取决于URL资源的缓存控制头),这意味着每次我都不想重新加载ListView数据(来自外部URL)用户返回MainActivity

我发现这篇文章:Android AsyncTask ListView - JSON|Surviving w/ Android这很好,但不是我想要的。每次用户返回MainActivity时,我都不想执行AsyncTask。

我想过将ListView项存储在Application的全局可用参数中。此参数将是某种自定义容器,其中包含ListItems及其到期时间戳。然后,如果ListView项有效,则可以检查AsyncTask的“doInBackground”方法。如果是,则返回它们,否则它们将从URL加载并保存到全局变量中。

我的问题:这个解决方案有意义吗?你怎么解决这个问题?有关改善这一点的任何想法吗?

3 个答案:

答案 0 :(得分:1)

嗯,你的有意义;但是,我想补充一点。

编码部分,

  • 每次请求成功完成后缓存JSON。您可能需要使用应在自定义LruCache类中定义的Application。解析JSON后,每个键/值对都存储数据模型。例如,cache.put(model.id, model)

对于UX部分,

  • 您不需要每次都更新JSON,但提供动作触发器来执行此操作。一些常见的方法是:

    • 在屏幕上的某处提供刷新按钮? (可以是ActionBar上的项目...)
    • 应用程序开始执行。
    • 用户下拉ListView以刷新内容。
    • ...

答案 1 :(得分:0)

由于ListView数据在检索时已经被序列化为JSON,我认为最好的方法是坚持使用JSON。 Android处理SharedPreferences中的持久字符串。您还可以使用SharedPreferences持久保存keepalive时间戳,以便确定何时刷新数据。

这将允许您在不查询服务器的情况下在应用程序加载之间以及活动之间填充ListView。

答案 2 :(得分:0)

 var api={
        getapicallForCategories(){
            var url='your url';
           return fetch(url).then((res)=>res.json()); 
        },
        
        };
        
        module.exports=api;

 componentDidMount() {
        api.getapicallForCategories().then((res) => {
            this.setState({
                listdata: res,
            })  
        });
    }
    
    
    //inside render
     for (var m = 0; m < this.state.listdata.length; m++) {
                this.state.listdataCategory[m] = this.state.listdata[m].Category;
                this.state.listdataPrice[m] = this.state.listdata[m].Amt;

                const details = {
                    name: this.state.listdataCategory[m],
                    price: this.state.listdataPrice[m],
                }
                list.push(details);

            }
            
            
 //   inside return
  {
                            list.map((l, i) => (
                                <ListItem

                                    key={i}
                                    title={l.name}
                                    subtitle={l.price}


                                    rightIcon={<Icon name={'add-circle'} style={{ color: '#006400', fontSize: 40 }} onPress={() => this.onIncrease(l.price, i)} />}
                                    avatar={<Icon name={'remove-circle'} style={{ color: '#FF0000', fontSize: 40 }} onPress={() => this.onRemove(l.price, i)} />}

                                />

                            ))


                        }