我有一个API响应,我需要在listView上显示。一开始它以15个项目开始,我想在用户向下滚动并到达列表末尾时添加更多项目。使用Retrofit自动翻页API的最佳策略是什么,以便默认下载所有可用数据?分页有效,但我不认为是从下一个URL加载新数据,而是重新加载旧数据。 请帮忙!任何帮助将不胜感激。
这些是我需要使用的响应中的参数: 显然我没有以正确的方式使用它们。
"total": 181,
"per_page": "15",
"current_page": 1,
"last_page": 13,
"next_page_url": "URL",
"prev_page_url": null,
"from": 1,
"to": 15,
主:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://nmc.no-ip.org:8888/")
.addConverterFactory(GsonConverterFactory.create())
.build();
StreamingOfferService service = retrofit.create(StreamingOfferService.class);
Call<ResponseResult> response = service.getStreamingOffers();
response.enqueue(new Callback<ResponseResult>() {
@Override
public void onResponse(Call<ResponseResult> result, Response<ResponseResult> response) {
createList(response);
}
@Override
public void onFailure(Call<ResponseResult> result, Throwable t) {
}
});
}
public void createList(final Response<ResponseResult> response)
{
final ListView listview = (ListView) findViewById(R.id.listview);
final StreamingAdapter adapter = new StreamingAdapter(this,R.layout.listofusers,response);
listview.setAdapter(adapter);
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) {
ResponseResult r = new ResponseResult();
int currentPageNumber = r.getCurrentPage();
boolean loading = true;
// String next_page_url = r.getNextPageUrl();
if (listview.getLastVisiblePosition() == listview.getAdapter().getCount() - 1
&& listview.getChildAt(listview.getChildCount() - 1).getBottom() <= listview.getHeight()) {
r.getNextPageUrl();
currentPageNumber++;
loading = true;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://nmc.no-ip.org:8888/")
.addConverterFactory(GsonConverterFactory.create())
.build();
StreamingOfferService service = retrofit.create(StreamingOfferService.class);
Call<ResponseResult> response = service.getStreamingOffers();
response.enqueue(new Callback<ResponseResult>() {
@Override
public void onResponse(Call<ResponseResult> result, Response<ResponseResult> response) {
adapter.addToList(response);
}
@Override
public void onFailure(Call<ResponseResult> result, Throwable t) {
}
});
}}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
适配器:
public class StreamingAdapter extends BaseAdapter {
private Context context;
private int resource;
private LayoutInflater inflater;
private List<StreamingOffer> streamingOfferList;
public StreamingAdapter(Context context, int resource, Response<ResponseResult> response) {
this.context=context;
this.resource=resource;
this.inflater=LayoutInflater.from(context);
streamingOfferList = response.body().getData();
}
void addToList(Response<ResponseResult> response)
{
this.streamingOfferList.addAll(streamingOfferList);
this.notifyDataSetChanged();
}
public class Holder extends User {
private TextView full_name;
private TextView location;
private TextView price;
private TextView currency_symbol;
private TextView total_streamed;
private ImageView offer;
private ImageView profile;
private ImageView iconUser;
private ImageView iconStar;
private ImageView iconStar1;
private ImageView iconStar2;
private ImageView iconStar3;
private ImageView iconStar4;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder = new Holder();
View itemView = convertView;
StreamingOffer streamingOffer = getItem(position);
User u = streamingOffer.getUser();
if(itemView==null) {
itemView = inflater.inflate(resource, parent, false);
holder.full_name = (TextView) itemView.findViewById(R.id.full_name);
holder.full_name.setText(u.getFullName());
holder.location = (TextView) itemView.findViewById(R.id.location);
holder.location.setText(streamingOffer.getLocation());
holder.price = (TextView) itemView.findViewById(R.id.price);
holder.currency_symbol = (TextView) itemView.findViewById(R.id.currency_symbol);
if(streamingOffer.getIs_free()==0)
{
holder.price.setText(streamingOffer.getPrice());
holder.currency_symbol.setText(streamingOffer.getCurrencySymbol());
}
else
holder.price.setText("FREE");
holder.total_streamed = (TextView) itemView.findViewById(R.id.total_streamed);
holder.total_streamed.setText(u.getTotalStreamed());
holder.offer = (ImageView) itemView.findViewById(R.id.offer);
holder.profile = (ImageView) itemView.findViewById(R.id.profile);
holder.iconUser = (ImageView) itemView.findViewById(R.id.iconUser);
holder.iconStar = (ImageView) itemView.findViewById(R.id.iconStar);
holder.iconStar1 = (ImageView) itemView.findViewById(R.id.iconStar1);
holder.iconStar2 = (ImageView) itemView.findViewById(R.id.iconStar2);
holder.iconStar3 = (ImageView) itemView.findViewById(R.id.iconStar3);
holder.iconStar4 = (ImageView) itemView.findViewById(R.id.iconStar4);
Images im = new Images();
im.getImage_75x75();
final GsonBuilder builder = new GsonBuilder();
final Gson gson = builder.create();
String json = gson.toJson(im);
if(json.contains("75x75")){
Picasso.with(context).load(im.getImage_75x75()).into(holder.profile);
}
//Picasso.with(context).load(jsonRepresentation).into(holder.offer);
Picasso.with(context).load(im.getImage_154x154()).into(holder.profile);
Picasso.with(context).load(im.getImage_154x154()).into(holder.offer);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar);
Picasso.with(context)
.load(R.drawable.half_red_star).into(holder.iconStar1);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar2);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar3);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar4);
// Picasso.with(context)
// .load("http://nmc.no-ip.org:8888/assets/images/offer-2.png").into(holder.offer);
// Picasso.with(context)
// .load("http://nmc.no-ip.org:8888/assets/images/profile-1.png").into(holder.profile);
if(u.getIs_online()==1) {
Picasso.with(context)
.load(R.drawable.icon_user_online).into(holder.iconUser);
}
else
Picasso.with(context)
.load(R.drawable.icon_user_offline).into(holder.iconUser);}
if(u.getRating()!=null) {
if (u.getRating() == "1.0" && u.getRating() == "1.5") {
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar1);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar2);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar3);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar4);
}
if (u.getRating() == "2.0" && u.getRating() == "2.5") {
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar1);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar2);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar3);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar4);
}
if (u.getRating() == "3.0" && u.getRating() == "3.5") {
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar1);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar2);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar3);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar4);
}
if (u.getRating() == "4.0" && u.getRating() == "4.5") {
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar1);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar2);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar3);
Picasso.with(context)
.load(R.drawable.icon_black_star).into(holder.iconStar4);
}
if (u.getRating() == "5.0") {
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar1);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar2);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar3);
Picasso.with(context)
.load(R.drawable.icon_red_star).into(holder.iconStar4);
}
}
itemView.setTag(holder);
return itemView;
}
@Override
public int getCount() {
return streamingOfferList.size();
}
@Override
public StreamingOffer getItem(int position) {
return streamingOfferList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}