【问题标题】:Add New Item to ListView For Implement Endless List In Android将新项目添加到 ListView 以在 Android 中实现无尽列表
【发布时间】:2015-08-12 15:20:40
【问题描述】:

在我的列表中,我想实现无尽的列表。现在当我向下滚动并接收到列表的第五项时,新数据加载但数据未添加到列表末尾,它清除列表的所有项目然后显示。

如何将新项目附加到列表末尾。 请注意,我正在使用 adapter.notifyDataSetChanged();但仍然不适合我。

这里是我的 EndlessScrollListener 类:

public class EndlessScrollListener implements AbsListView.OnScrollListener {

        private int visibleThreshold = 5;
       // private int currentPage = 0;

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (scrollState == SCROLL_STATE_IDLE) {
                if (myList.getLastVisiblePosition() >= myList.getCount() - visibleThreshold) {
                    cpage++;
                    new sendpage(cpage).execute();
                    if (isOnline()) {
                        requestData("http://192.168.1.3/android_login_api/include/get_post.php");
                    } else {
                        Toast.makeText(MainActivity.this, "Network isn't available", Toast.LENGTH_LONG).show();
                    }

                    updateDisplay();
                    adapter.notifyDataSetChanged();


                }
            }
        }

还有我的 updateDisplay 函数:

protected void updateDisplay() {
     adapter = new MyCustommAdapter(MainActivity.this, R.layout.list_item, postList);

       // adapter = new MyCustommAdapter(MainActivity.this, R.layout.list_item, postList);
    adapter.notifyDataSetChanged();
    myList.setAdapter(adapter);

}

我的 requestData() 函数:

 private void requestData(String uri) {


        swipeRefreshLayout.setRefreshing(true);
        StringRequest request = new StringRequest(uri,

                new Response.Listener<String>() {

                    @Override
                    public void onResponse(String response) {
                        postList = PostJSONParser.parseFeed(response);

                        updateDisplay();
                        adapter.notifyDataSetChanged();
                        swipeRefreshLayout.setRefreshing(false);
                    }

                },

                new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError ex) {
                        Toast.makeText(MainActivity.this, ex.getMessage(), Toast.LENGTH_LONG).show();

                        swipeRefreshLayout.setRefreshing(false);
                    }
                });

        RequestQueue queue = Volley.newRequestQueue(this);
        queue.add(request);
    }

PostJSONParser 类:

public class PostJSONParser {


    public static List<Post> parseFeed(String content){


        JSONArray ar = null;
        try {
            ar = new JSONArray(content);
            List<Post> postList = new ArrayList<Post>();
            for (int j =0; j<ar.length(); j++){
                JSONObject obj = ar.getJSONObject(j);
                Post post = new Post();

                post.setId(obj.getInt("id"));
                post.setTitle(obj.getString("title"));
                post.setContent(obj.getString("content"));
                post.setCreated_at(obj.getString("created_at"));
                post.setUrl_image(obj.getString("url_image"));
                postList.add(post);

            }
            return postList;
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }


    }
}

注意 requestData() 函数使用 volley 获取新项目。

知道如何实现吗?

【问题讨论】:

  • 在您的 requestData(...) 函数中,您是否正在更新 postList 变量?因为我认为您正在用新数据覆盖 (ArrayList) postList 而不仅仅是添加 postList.add(newItem);
  • 我添加了 requestData() 函数。
  • 这是问题 postList = PostJSONParser.parseFeed(response);这一行正在用新数据覆盖这个变量,所以你以前的数据会丢失
  • 我更新了答案你可以试试新的

标签: android listview


【解决方案1】:

我不确定我是否完全理解您的问题,但是在尝试创建“无限列表”时,我总是发现最好使用的结构是 ArrayList,它具有用于添加和删除数据的预设功能,我发现非常有用。 http://developer.android.com/reference/java/util/ArrayList.html

【讨论】:

  • 我知道那里有很多教程但是,如果你能告诉我如何在我的代码中实现
【解决方案2】:

已更新这是解决方案创建一个新的ArrayList 变量,该变量将临时保存新数据,然后将此 ArrayList 添加到原始 use ArrayList everwhere

首先声明变量 postList 的地方,确保它是这样的

 ArrayList<Post> postList=new ArrayList<Post>(); //and make this variable global 

在您的 parseFeed 函数中排名第二

public class PostJSONParser {


public static ArrayList<Post> parseFeed(String content){


    JSONArray ar = null;
    try {
        ar = new JSONArray(content);
        ArrayList<Post> postList = new ArrayList<Post>();
        for (int j =0; j<ar.length(); j++){
            JSONObject obj = ar.getJSONObject(j);
            Post post = new Post();

            post.setId(obj.getInt("id"));
            post.setTitle(obj.getString("title"));
            post.setContent(obj.getString("content"));
            post.setCreated_at(obj.getString("created_at"));
            post.setUrl_image(obj.getString("url_image"));
            postList.add(post);

        }
        return postList;
    } catch (JSONException e) {
        e.printStackTrace();
        return null;
    }


}
}

最后在你的 requestData() 函数中

private void requestData(String uri) {


    swipeRefreshLayout.setRefreshing(true);
    StringRequest request = new StringRequest(uri,

            new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {
                    ArrayList<Post> tempList=new ArrayList<Post>();
                    tempList = PostJSONParser.parseFeed(response);
                    postList.addAll(tempList);

                    updateDisplay();
                    adapter.notifyDataSetChanged();
                    swipeRefreshLayout.setRefreshing(false);
                }

            },

            new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError ex) {
                    Toast.makeText(MainActivity.this, ex.getMessage(), Toast.LENGTH_LONG).show();

                    swipeRefreshLayout.setRefreshing(false);
                }
            });

    RequestQueue queue = Volley.newRequestQueue(this);
    queue.add(request);
}

确保在任何地方都使用 ArrayList

【讨论】:

  • 我添加到 requestData() 函数但出现错误:java.lang.NullPointerException
  • 你可以试试这个 postList.addAll(PostJSONParser.parseFeed(response));并删除我刚刚添加的所有新行,只需使用这一行
  • 我添加了解析器。我再次尝试最后一个代码 bu 在该行出现 java.lang.NullPointerException 错误
  • 我觉得我找到了一些东西。问题是我第一次使用和更新列表只有一个代码。我创建具有不同名称的相同函数并使用您的代码。它可以工作,但是当加载新项目时,它会转到第一个项目。怎么解决?
  • 这是另一个问题,也许这会起作用SO
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多