如何在Android中滚动加载ListView实现?

时间:2014-02-18 10:41:21

标签: android android-listview custom-adapter onscrolllistener

我在片段中实现了listview。在该listview中,我使用自定义适配器来显示带有描述的图像。数据来自Web服务器。有许多带有图像的列表项,所以我想在滚动加载ListView上实现相同的。

我应该遵循哪种方法来做同样的事情?我试图谷歌并找到一些样本,但它不符合我的要求。

以下是包含listview的Fragment的代码。提前谢谢。

  

FragmentTab1.class

public class FragmentTab1 extends Fragment implements
    AdapterView.OnItemClickListener {

DisplayImageOptions options;
protected ImageLoader imageLoader = ImageLoader.getInstance();
JSONArray AdsArray = null;

String TAG_IMAGE = "image";
String TAG_DISCRIPTION = "description";
ListView lv;
final Context context = getActivity();

static ArrayList<HashMap<String, String>> adList;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragmenttab1, container,false);

    options = new DisplayImageOptions.Builder().showStubImage(R.drawable.no_image).cacheInMemory().cacheOnDisc()
            .bitmapConfig(Bitmap.Config.RGB_565).build();

    lv = (ListView) rootView.findViewById(R.id.listView1);
    lv.setOnItemClickListener(this);
    adList = new ArrayList<HashMap<String, String>>();

    new LoadMyAds().execute();
    return rootView;
}


class LoadMyAds extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        // TODO Auto-generated method stub
        UserFunctions userFunction = new UserFunctions();
        String type = "all";
        JSONObject json = userFunction.myAds(userid, type);
        try {
            if (json.getString("status") != null) {
                String res = json.getString("status");
                if (Integer.parseInt(res) == 1) {
                    adList.clear();
                    AdsArray = json.getJSONArray("myadslistsArray");
                    for (int i = 0; i < AdsArray.length(); i++) {
                        JSONObject c = AdsArray.getJSONObject(i);                           
                        String description = c.getString(TAG_DISCRIPTION);                          
                        String image = c.getString(TAG_IMAGE);
                        HashMap<String, String> map = new HashMap<String, String>();                            
                        map.put(TAG_IMAGE, image);                          
                        map.put(TAG_DISCRIPTION, description);                      adList.add(0, map);
                    }
                } else {
                    Toast.makeText(getActivity().getApplicationContext(),
                            "parsing error", Toast.LENGTH_LONG).show();
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        // image parameter need to be added

        lv.setAdapter(new CustomAdapter(adList));
    }
}

class CustomAdapter extends BaseAdapter {

    ArrayList<HashMap<String, String>> locallist;

    public CustomAdapter(ArrayList<HashMap<String, String>> list) {
        // TODO Auto-generated constructor stub
        locallist = list;
        imageLoader.init(ImageLoaderConfiguration
                .createDefault(getActivity()));
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return locallist.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        // return null;
        return getItem(getCount() - position - 1);

    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View row = convertView;


        if (row == null) {
            row = getActivity().getLayoutInflater().inflate(
                    R.layout.ad_list_item, null);

            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.desc= (TextView) row.findViewById(R.id.title);                           
            viewHolder.img = (ImageView) row.findViewById(R.id.thumbImage);

            row.setTag(viewHolder);
        }

        final ViewHolder holder = (ViewHolder) row.getTag();

        holder.desc.setText(""+locallist.get(position).get(TAG_DISCRIPTION));

        imageLoader.displayImage(locallist.get(position).get(TAG_IMAGE),
                holder.img, options);
        return row;
    }
}

class ViewHolder {
    protected TextView desc;
    protected ImageView img;
}
}

1 个答案:

答案 0 :(得分:0)

将滚动侦听器附加到listView

lv.setOnScrollListener(new EndlessScrollListener());

这是类实现:

  class EndlessScrollListener implements OnScrollListener {
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {

         new LoadMyAds().execute();

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }
}