Java 如何在listview中添加分页?
通过下面的代码,我成功地将数据添加到列表视图中。我想在列表视图中添加分页。我在每个请求中得到5个项目,当用户滚动到底部时,我想再次调用web服务并获得接下来的5个项目。另外,我想在从服务器获取数据时在底部添加一个加载器。我尝试了下面的代码,但失败了。我怎样才能做到这一点 活动\u main.xmlJava 如何在listview中添加分页?,java,android,listview,pagination,adapter,Java,Android,Listview,Pagination,Adapter,通过下面的代码,我成功地将数据添加到列表视图中。我想在列表视图中添加分页。我在每个请求中得到5个项目,当用户滚动到底部时,我想再次调用web服务并获得接下来的5个项目。另外,我想在从服务器获取数据时在底部添加一个加载器。我尝试了下面的代码,但失败了。我怎样才能做到这一点 活动\u main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="70dp"
android:divider="@null" />
</LinearLayout>
MainActivity.java
public void getTimeLineData(final String token, final String page) {
timeLineItems = new ArrayList<TimeLineItem>();
listAdapter = new TimeLineListAdapter(this, timeLineItems);
listView.setAdapter(listAdapter);
// These two lines not needed,
// just to get the look of facebook (changing background color & hiding the icon)
/* getActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#3b5998")));
getActionBar().setIcon(
new ColorDrawable(getResources().getColor(android.R.color.transparent)));*/
// We first check for cached request
String tag_string_req = "req_register";
// making fresh volley request and getting json
StringRequest strReq = new StringRequest(Request.Method.POST, AppConfig.timeline, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
VolleyLog.d(TAG, "Response: " + response.toString());
if (response != null) {
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("status");
String message = jObj.getString("message");
if(error){
totalPages = jObj.getInt("totalPages");
pageCount = jObj.getInt("page");
int limit = jObj.getInt("limit");
parseJsonFeed(response);
}else {
Toast.makeText(TimelineActivity.this, message, Toast.LENGTH_SHORT).show();
}
}catch (Exception e){
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting params to register url
Map<String, String> params = new HashMap<String, String>();
params.put("my_token", token);
params.put("page", page);
params.put("limit", "5");
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
private void parseJsonFeed(String response) {
try {
JSONObject jsonObj = new JSONObject(response);
JSONArray feedArray = jsonObj.getJSONArray("data");
for (int i = 0; i < feedArray.length(); i++) {
JSONObject feedObj = (JSONObject) feedArray.get(i);
TimeLineItem item = new TimeLineItem();
item.setId(feedObj.getInt("id"));
item.setName(feedObj.getString("name"));
item.setLname(feedObj.getString("lname"));
// Image might be null sometimes
String image = feedObj.isNull("image") ? null : feedObj
.getString("image");
item.setImge(image);
item.setStatus(feedObj.getString("story_text"));
item.setProfilePic(feedObj.getString("profile_pic"));
item.setTimeStamp(feedObj.getString("time_stamp"));
item.setIsLike(feedObj.getInt("is_like"));
item.setTotalLikes(feedObj.getString("total_likes"));
item.setTotalComment(feedObj.getString("total_comments"));
/*// url might be null sometimes
String feedUrl = feedObj.isNull("url") ? null : feedObj
.getString("url");
item.setUrl(feedUrl);*/
timeLineItems.add(item);
}
// notify data changes to list adapater
listAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
//This method will get data from the web api
private void getData() {
//Adding the method to the queue by calling the method getDataFromServer
getTimeLineData(token , String.valueOf(requestCount));
//Incrementing the request counter
requestCount++;
}
public void timelineScrollItem(){
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem + visibleItemCount == totalItemCount){
// End has been reached
getData();
}
}
});
}
public void getTimeLineData(最终字符串标记,最终字符串页){
timeLineItems=新的ArrayList();
listAdapter=新的TimeLineListAdapter(这是timeLineItems);
setAdapter(listAdapter);
//这两条线不需要,,
//只是为了获得facebook的外观(更改背景颜色并隐藏图标)
/*getActionBar().setBackgroundDrawable(新的ColorDrawable(Color.parseColor(“#3b5998”));
getActionBar().setIcon(
新的ColorDrawable(getResources().getColor(android.R.color.transparent))*/
//我们首先检查缓存的请求
String tag_String_req=“req_register”;
//发出新的截击请求并获取json
StringRequest strReq=newStringRequest(Request.Method.POST、AppConfig.timeline、new Response.Listener()){
@凌驾
公共void onResponse(字符串响应){
d(标记“Response:+Response.toString());
if(响应!=null){
试一试{
JSONObject jObj=新的JSONObject(响应);
布尔错误=jObj.getBoolean(“状态”);
字符串消息=jObj.getString(“消息”);
如果(错误){
totalPages=jObj.getInt(“totalPages”);
pageCount=jObj.getInt(“页面”);
int limit=jObj.getInt(“limit”);
parseJsonFeed(响应);
}否则{
Toast.makeText(TimelineActivity.this,message,Toast.LENGTH_SHORT).show();
}
}捕获(例外e){
}
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
d(标记“Error:+Error.getMessage());
}
}) {
@凌驾
受保护的映射getParams(){
//发布参数以注册url
Map params=新的HashMap();
参数put(“我的令牌”,令牌);
参数put(“第页”,第页);
参数put(“限制”、“5”);
返回参数;
}
};
//将请求添加到请求队列
AppController.getInstance().addToRequestQueue(streq,标记字符串请求);
}
私有void parseJsonFeed(字符串响应){
试一试{
JSONObject jsonObj=新的JSONObject(响应);
JSONArray feedArray=jsonObj.getJSONArray(“数据”);
对于(int i=0;i
将setOnScrollListener替换为此
listView.setOnScrollListener(new OnScrollListener(){
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int lastInScreen = firstVisibleItem + visibleItemCount;
if((lastInScreen == totalItemCount) && !(loadingMore)){
getData();
}
}
});
您可以将该类用于
private class CustomLoadingListItemCreator implements LoadingListItemCreator {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.custom_loading_list_item, parent, false);
return new VH(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// Bind custom loading row if needed
}
}
您可以使用此如果您在这方面有任何问题,可能会有教程可用,然后发布问题“是的,我已阅读教程”。从上面的代码可以看出,当添加所有项并持续滚动方法调用时,我的listview变得不可见。我想在scroll到达底部时调用它。当您调用timelineScrollItem()方法时,请添加完整代码我正在onCreate中调用timelineScrollItem()方法。我已添加了答案,请尝试加载更多内容?如果已在进行中,将阻止您再次调用同一服务,因此,当您开始调用make it loadingMore=true并在响应之后