通过scrollview一次加载一些json元素

时间:2013-12-20 15:58:00

标签: android listview android-asynctask scrollview

我有一个ListFragment,其中包含一个项目列表。我想一次加载说9项,当我滚动并到达列表视图的底部我想在后台加载另外9项。

我向我的网络服务器发出了2个请求:

1)通过searh()方法获取项目的所有项目ID

2)通过getId(id)方法获取特定项目的所有项目详细信息,通过getId(id)方法

我实现的版本获取所有id,然后在AsyncTask的doInBackground方法中一次加载所有项目并且它可以工作。它需要很长时间(我不想要一个按钮,因为它非常难看)。

我想介绍onScrollListener的这个事情,这样当我第一次打开我的应用程序时,在后台我得到所有的ID,然后我得到前9个项目并显示它们。然后当我滚动到最后我想加载下9个项目。我该怎么做?

我已经阅读了一些帖子,但我不清楚,特别是由于我有2个需要在后台运行的功能,1个功能需要运行一次而其他功能需要多次运行,我需要跟踪我得到的身份。

如果可能的话,我也想添加一个函数,如果我稍微拉ListView那么它应该更新我的视图。

这是我的代码:

import java.util.ArrayList;
import java.util.HashMap;

import android.app.ListFragment;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.Toast;

import com.prjma.lovertech.R;
import com.prjma.lovertech.adapter.ListViewAdapter;
import com.prjma.lovertech.util.MVPFunctions;


public class CompraFragment extends ListFragment  {


    public ListView listView;
    public ListViewAdapter adapter;

    /**
     * Keep track of the login task to ensure we can cancel it if requested.
     */
    private DownloadTask mDownloadTask = null;

    public ArrayList<HashMap<String, Object>> items;
    public Bitmap icon;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        //View rootView = inflater.inflate(R.layout.fragment_compra, false); 
        View rootView = inflater.inflate(R.layout.fragment_compra, container, false); 

        // now you must initialize your list view
        listView = (ListView) rootView.findViewById(android.R.id.list); 

        mDownloadTask = new DownloadTask();
        mDownloadTask.execute((Void) null);     


        return rootView;
    }


    /**
     * Represents an asynchronous login/registration task used to authenticate
     * the user.
     */
    public class DownloadTask extends AsyncTask<Void, Void, Boolean> {

        private ProgressDialog progressDialog;

        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO: attempt authentication against a network service.

            //Here i get all the id's
            ArrayList<Long> ids = MVPFunctions.getMioSingolo().search();

            //for each id get all its details and put it in a map
            items = new ArrayList<HashMap<String, Object>>();
            for(int i=0; i < ids.size(); i++){
                items.add(MVPFunctions.getMioSingolo().getItem(ids.get(i)));
            }
            return true;
        }


        @Override
        protected void onPreExecute(){
            /*
             * This is executed on UI thread before doInBackground(). It is
             * the perfect place to show the progress dialog.
             */
            progressDialog = ProgressDialog.show(getActivity(), "", "Downloading Content...");
        }

        @Override
        protected void onPostExecute(final Boolean success) {
            mDownloadTask = null;

            // dismiss the dialog after getting all products
            progressDialog.dismiss();
            //showProgress(false);

            if (items.get(0).get("status error")!= null){
                Toast.makeText(getActivity(), "status error = " + items.get(0).get("status error"), Toast.LENGTH_LONG).show();
                Log.i("status error put toast", (String) items.get(0).get("status error"));
                //fai qualcosa, tipo torna indietro, ecc
            }
            // updating UI from Background Thread
            ListViewAdapter adapter = new ListViewAdapter(getActivity(),R.layout.listview_item_row, items, icon);
            // updating listview
            listView.setAdapter(adapter);
        }

        @Override
        protected void onCancelled() {
            mDownloadTask = null;
            //showProgress(false);
        }
    }
}

适配器类:

import java.util.ArrayList;
import java.util.HashMap;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.prjma.lovertech.R;
import com.prjma.lovertech.activity.DettagliActivity;
import com.prjma.lovertech.model.Item;

public class ListViewAdapter extends ArrayAdapter<String> {

    private static LayoutInflater inflater = null;

    public Context context; 
    public int layoutResourceId;
    public ArrayList<HashMap<String, Object>> items;
    public Bitmap icon;

    //public ImageLoader imageLoader;

    public ListViewAdapter(Context context, int listviewItemRow, ArrayList<HashMap<String, Object>> items, Bitmap icon) {
        // TODO Auto-generated constructor stub
        super(context, listviewItemRow);
        this.items = items;
        this.context = context;
        this.icon = icon;
    }

    public int getCount() {
        return items.size();
    }

    public Item getItem(Item position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ViewHolder viewHolder = new ViewHolder();

        if (row == null) {

            inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.listview_item_row, null);       

            viewHolder.ic_thumbnail = (ImageView)row.findViewById(R.id.ic_thumbnail);
            viewHolder.scadenza = (TextView)row.findViewById(R.id.tvScadenza);
            viewHolder.prezzo = (TextView)row.findViewById(R.id.tvPrezzo);
            viewHolder.followers = (TextView)row.findViewById(R.id.tvFollowers);
            viewHolder.hProgressBar = (ProgressBar)row.findViewById(R.id.hProgressBar);

            row.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder)row.getTag();
        }

        HashMap<String, Object> item = items.get(position);
        viewHolder.ic_thumbnail.setImageBitmap((Bitmap) item.get("pic1m"));
        viewHolder.scadenza.setText((CharSequence) item.get("scadenza"));
        viewHolder.prezzo.setText((CharSequence) item.get("prezzo"));
        viewHolder.followers.setText((CharSequence) item.get("followers"));
        viewHolder.hProgressBar.setProgress((Integer) item.get("coefficient"));

        //row.onListItemClick(new OnItemClickListener1());
        row.setOnClickListener(new OnItemClickListener(position));
        return row;
    }

    private class OnItemClickListener implements OnClickListener {

        private int mPosition;

        private OnItemClickListener(int position){
            mPosition = position;
        }

        @Override
        public void onClick(View arg0) {

            Log.i("onListItemClickList", "Item clicked: " + mPosition);
            Toast.makeText(context, "Message " + Integer.toString(mPosition), Toast.LENGTH_SHORT).show();

            Intent intent = new Intent(context, DettagliActivity.class);
            Bundle bundle = new Bundle();
            bundle.putInt("id", mPosition);
            intent.putExtras(bundle);
            context.startActivity(intent);
        }   
    }

    static class ViewHolder {
        public TextView prezzo;
        public TextView scadenza;
        public TextView followers;
        public ImageView ic_thumbnail;
        public ProgressBar hProgressBar;
    }
}

1 个答案:

答案 0 :(得分:0)

在适配器中,检查用户与数据集底部的距离。当他们到达最后,调用一个从网络中获取更多项目的方法。我通常使用“REFRESH_THRESHOLD”整数来在需要之前预取项目。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Item current = getItem(position);

    //Pre-fetch
    if(getCount() - position <= REFRESH_THRESHOLD){
        //If there are more items to fetch, and a network request isn't already underway
        if(is_loading == false && has_remaining_items == true){
            getItemsFromNetwork();
        }
    }