Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android在底部时会自动在listview中加载更多项目_Android_Android Listview - Fatal编程技术网

Android在底部时会自动在listview中加载更多项目

Android在底部时会自动在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

我正在尝试在我的应用程序中实现这个功能,我知道以前有人问过这个问题,但我不明白。此时,我通过JSON请求检索所有项目,如下所示

myTicketsFragment.java

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);
                }
            }
        });
    }
}