Android在底部时会自动在listview中加载更多项目
我正在尝试在我的应用程序中实现这个功能,我知道以前有人问过这个问题,但我不明白。此时,我通过JSON请求检索所有项目,如下所示 myTicketsFragment.javaAndroid在底部时会自动在listview中加载更多项目,android,android-listview,Android,Android Listview,我正在尝试在我的应用程序中实现这个功能,我知道以前有人问过这个问题,但我不明白。此时,我通过JSON请求检索所有项目,如下所示 myTicketsFragment.java private class PrefetchData extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); dial
private class PrefetchData extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(getActivity());
dialog.setMessage("Downloading..");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
HttpReader httpReader = new HttpReader();
httpReader
.setOnResultReadyListener(new HttpReader.OnResultReadyListener() {
@Override
public void resultReady(String result) {
JsonHelper jsonHelper = new JsonHelper();
tickets = jsonHelper.getTickets(result);
TicketAdapter ticketAdapter = new TicketAdapter(
getActivity(), tickets);
final ListView listViewTickets = (ListView) rootView
.findViewById(R.id.listViewTickets);
listViewTickets.setAdapter(ticketAdapter);
listViewTickets
.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(
AdapterView<?> parentView,
View childView, int position,
long id) {
if (isNetworkAvailable()) {
Bundle bundle = new Bundle();
bundle.putInt("ticketId",
tickets.get(position)
.getId());
Intent ticketDetail = new Intent(
getActivity(),
TicketActivity.class);
ticketDetail.putExtras(bundle);
startActivity(ticketDetail);
} else {
showNoInternetDialog();
}
}
});
listViewTickets.setEmptyView(rootView
.findViewById(R.id.empty));
dialog.dismiss();
}
});
httpReader
.execute("http://aa.aaaa.aa:8882/desk/API/v1/json.php?auth=platformt&a=getTickets&uauth="
+ authCode + "&uid=" + uId + "&mode=mytickets");
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
私有类预取数据扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
dialog=newprogressdialog(getActivity());
setMessage(“下载…”);
对话框。setUndeterminate(true);
对话框。可设置可取消(false);
dialog.show();
}
@凌驾
受保护的Void doInBackground(Void…arg0){
HttpReader HttpReader=新HttpReader();
httpReader
.setOnResultReadyListener(新的HttpReader.OnResultReadyListener(){
@凌驾
公共无效结果(字符串结果){
JsonHelper JsonHelper=新的JsonHelper();
tickets=jsonHelper.getTickets(结果);
TicketAdapter TicketAdapter=新的TicketAdapter(
getActivity(),票据);
最终ListView listViewTickets=(ListView)根视图
.findViewById(R.id.listViewTickets);
setAdapter(ticketAdapter);
listViewTickets
.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共空间(
AdapterView家长视图,
视图子视图,int位置,
长id){
if(isNetworkAvailable()){
Bundle=新Bundle();
bundle.putInt(“ticketId”,
票。获取(位置)
.getId());
意向书票证详情=新意向书(
getActivity(),
(触觉类);
票证详细信息(捆绑);
startActivity(ticketDetail);
}否则{
showNoInternetDialog();
}
}
});
listViewTickets.setEmptyView(根视图
.findviewbyd(R.id.empty));
dialog.dismise();
}
});
httpReader
.执行(”http://aa.aaaa.aa:8882/desk/API/v1/json.php?auth=platformt&a=getTickets&uauth="
+authCode+“&uid=“+uid+”&mode=mytickets”);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
}
}
我想我需要知道显示的是最后一项,并检索新项。。我只是不太懂技术,也找不到好的例子
如果有人能把我引向正确的方向,那就太好了 我建议您将
ListView
移出AsyncTask
。如果您愿意这样做,您可以通过以下方式实现延迟加载(这里是一个基本想法):
公共类MyActivity扩展活动{
私有MyAdapter MyAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView ListView=findViewById(R.id.ListView);
setOnScrollListener(新的AbsListView.OnScrollListener(){
@凌驾
公共无效onScrollStateChanged(AbsListView视图,int scrollState){
}
@凌驾
public void onScroll(AbsListView视图、int firstVisibleItem、int visibleItemCount、int totalItemCount){
布尔加载更多=
firstVisibleItem+visibleItemCount>=totalItemCount;
如果(加载更多){
AsyncTask AsyncTask=新建AsyncTask(){
@凌驾
受保护的void onPreExecute(){
//做一些事情,显示加载图像
}
@凌驾
受保护的void onPostExecute(JSONObject JSONObject){
myAdapter.data=jsonObject;
myAdapter.notifyDataSetChanged();
}
@凌驾
受保护的JSONObject doInBackground(整数…参数){
int startValue=参数[0];
//使用定点偏移量=起始值发出请求
返回新的JSONObject();
}
};
int startValue=totalItemCount;
asyncTask.execute(startValue);
}
}
});
}
}
因此,当您看到
列表视图的最后一项时,只需下载其他数据并将其推入适配器。我正在使用asynctask加载对话框:s@Niels您可以在AsyncTask
中保留ProgressDialog
,这样就可以了。但请记住,在加载过程中显示PG
并不是最好的模式
public class MyActivity extends Activity {
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView = findViewById(R.id.listView);
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) {
boolean loadMore =
firstVisibleItem + visibleItemCount >= totalItemCount;
if (loadMore) {
AsyncTask<Integer, Void, JSONObject> asyncTask = new AsyncTask<Integer, Void, JSONObject>() {
@Override
protected void onPreExecute() {
//do stuff, show loading image
}
@Override
protected void onPostExecute(JSONObject jsonObject) {
myAdapter.data = jsonObject;
myAdapter.notifyDataSetChanged();
}
@Override
protected JSONObject doInBackground(Integer... params) {
int startValue = params[0];
//make a request with pointing offset = startValue
return new JSONObject();
}
};
int startValue = totalItemCount;
asyncTask.execute(startValue);
}
}
});
}
}