如何实现无限滚动的listview

How to implement endless scrolling listview

我正在创建一个应用程序,我在其中使用 Json 解析来解析数据。我已经实现了列表视图,在我的回复中我有 totalpagecurrent page 个对象,

新用户将从第一页获得项目。当用户在列表视图中滚动时,列表会扩展到下一页(以及下一页和下一页等)中的项目

这是我的回复 http://pastie.org/10259792

以下是我试过的代码:

主页片段

public class HomeFragment extends Fragment {
// Listview Adapter
        ListViewAdapter adapters;

            // Connection detector
            ConnectionDetector cd;

            // Alert dialog manager
            AlertDialogManager alert = new AlertDialogManager();

            // Progress Dialog
            private ProgressDialog pDialog;

            // Creating JSON Parser object
            JSONparserr jsonParser = new JSONparserr();

            ArrayList<HashMap<String, String>> WebsiteList;

            // albums JSONArray
            JSONArray data = null;
            String link_url;

            ArrayList<HashMap<String, String>> arrayTemplist;

            private AutoCompleteTextView inputSearch;

            private ListView lv;

            private static final String URL_ALBUMS = "";

            private static final String WEBSITE_MENU_ID ="Brand_name";

            private static final String TAG_MATCH="data";
            //private static final String TAG_NAME="Brand_name";
            private static final String TAG_PROFILE="id";
            private static final String TAG_CAST="Company";

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

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

    lv = (ListView)rootView.findViewById(R.id.listpehlu);


    cd = new ConnectionDetector(getActivity());


    WebsiteList = new ArrayList<HashMap<String, String>>();

 // Loading Albums JSON in Background Thread
 new LoadAlbums().execute();

    // get listview

    inputSearch = (AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextViewhomefrag);

    inputSearch.addTextChangedListener(new TextWatcher() {


        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {

            arrayTemplist= new ArrayList<HashMap<String,String>>();
            String searchString =inputSearch.getText().toString().toLowerCase();

            for (int i = 0; i < WebsiteList.size(); i++)
            {
                String currentString =WebsiteList.get(i).get(HomeFragment.this.WEBSITE_MENU_ID);
                if (currentString.toLowerCase().startsWith(searchString ))
                {
                    arrayTemplist.add(WebsiteList.get(i));
                }
            }

            for (int i = 0; i < arrayTemplist.size(); i++)
            {
                String currentstrin = arrayTemplist.get(i).get(HomeFragment.this.WEBSITE_MENU_ID);
                //Toast.makeText(getApplicationContext(), currentstrin, Toast.LENGTH_LONG).show();

            }
      SimpleAdapter adapters = new SimpleAdapter(getActivity(), arrayTemplist,R.layout.list_item_match, new String[] {WEBSITE_MENU_ID,TAG_CAST
            }, new int[] {
                    R.id.txtbrndnm,R.id.txtbrndcomp});
            lv.setAdapter(adapters);

        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub                         
        }
    });


    lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int position,
                long arg3) {


            Selected_Product_Listing tf = new Selected_Product_Listing();
             Bundle bundle = new Bundle();
             bundle.putString("prducts_name", WebsiteList.get(position).get((WEBSITE_MENU_ID)));
            // bundle.putString("prducts_name", aList.get(position).get(INTEREST_ACCEPT_NAME));
             tf.setArguments(bundle);
              FragmentManager fm = getFragmentManager();
              FragmentTransaction ft = fm.beginTransaction();
              ft.replace(R.id.frame_container, tf);
              ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
              ft.addToBackStack(null);
              ft.commit();

            // Toast.makeText(getActivity(),"lets"+ WebsiteList.get(position).get(convertToBase64(convertToBase64(WEBSITE_MENU_ID))), Toast.LENGTH_LONG).show();

        }
    });   

    lv.setOnScrollListener(new OnScrollListener() {

        public void onScrollStateChanged(AbsListView view, int scrollState) {


        }

        public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {

        if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0)
        {

        }
        }
        });



    return rootView;
}

public String convertToBase64(String text) {
    byte[] data = null;
    try {
        data = text.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return Base64.encodeToString(data, Base64.DEFAULT);
}

class LoadAlbums extends AsyncTask<String, String, String> {

    private JSONObject jsonObj;


    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Loading...");
        pDialog.setIndeterminate(true);
        pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.custom_progress));

        pDialog.setCancelable(false);
        pDialog.show();
    }
    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        // getting JSON string from URL
        String json = jsonParser.makeHttpRequest(URL_ALBUMS, "GET",
                params);

        // Check your log cat for JSON reponse
        Log.d("Albums JSON: ", "> " + json);
        if (json != null) {
            try {
                jsonObj = new JSONObject(json);
                // Getting JSON Array node
                data = jsonObj.getJSONArray(TAG_MATCH);

                String totpage=jsonObj.getString("total_page");
                System.out.println("Total Page"+totpage);

                String curpage=jsonObj.getString("current_page");
                System.out.println("Total Page"+curpage);



                // looping through All Contacts
                for (int i = 0; i < data.length(); i++) {
                    JSONObject c = data.getJSONObject(i);
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put(WEBSITE_MENU_ID,c.getString(WEBSITE_MENU_ID));
                 map.put(TAG_PROFILE, c.getString(TAG_PROFILE));
                    map.put(TAG_CAST, c.getString(TAG_CAST));

                    WebsiteList.add(map);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }
       return null;
    }


    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all albums
        pDialog.dismiss();
        // updating UI from Background Thread

                ListAdapter adapter = new SimpleAdapter(
                        getActivity(), WebsiteList,
                        R.layout.list_item_match, new String[] {WEBSITE_MENU_ID,TAG_CAST
                         }, new int[] {
                                R.id.txtbrndnm,R.id.txtbrndcomp});


               lv.setAdapter(adapter); 

            }


    }

无限适配器

 public class EndLessAdapter extends ArrayAdapter<String> {

private Context context;
private List<String> items;
private int layoutId;

public EndLessAdapter(Context context, List<String> items, int LayoutId) {
    super(context,LayoutId,items);
    this.context = context;
    this.items = items;
    this.layoutId = LayoutId;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if(convertView == null)
        convertView = ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(layoutId,parent,false);

    TextView tView = (TextView)convertView.findViewById(R.id.txt);
    tView.setText(items.get(position));

    return convertView;
}
 }

EndlessLisView

public class EndlessListView extends ListView implements OnScrollListener {

private Context context;
private View footer;
private boolean isLoading;
private EndLessListener listener;

private BaseAdapter  adapter;

public EndlessListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);        
    this.setOnScrollListener(this);

    this.context = context;
}

public EndlessListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.setOnScrollListener(this);

    this.context = context;
}

public EndlessListView(Context context) {
    super(context);     
    this.setOnScrollListener(this);

    this.context = context;
}

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

}   

//  4
public void addNewData() {
    this.removeFooterView(footer);
   //       adapter.addAll(products);

    adapter.notifyDataSetChanged();
    isLoading = false;
}
public void setLoading()
{
    isLoading = false;
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {

    if(getAdapter() == null)
        return;

    if(getAdapter().getCount() == 0)
        return;

    int l = visibleItemCount + firstVisibleItem;
    System.out.println("List View Total Item Count = "+totalItemCount+" , l = "+l+", is_loading = "+isLoading);
    if(l >= totalItemCount && !isLoading){

        //  add footer layout
        this.addFooterView(footer);

        //  set progress boolean
        isLoading = true;
        System.out.println("$$$$$$$$$ call loaddata $$$$$$$$$$$");
        //  call interface method to load new data
        listener.loadData();
    }
}

//  Calling order from MainActivity
//  1
public void setLoadingView(int resId) {

    footer = ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(resId, null);      //      footer = (View)inflater.inflate(resId, null);
    this.addFooterView(footer);
    System.out.println("addfooter ====@@@@@@");
}   

//  2
public void setListener(EndLessListener listener) {
    this.listener = listener;
}   

//  3
public void setAdapter(BaseAdapter adapter) {       

    super.setAdapter(adapter);
    this.adapter = adapter;

    this.removeFooterView(footer);
}

public void removeFooter(){
    this.removeFooterView(footer);
}

}

尝试在列表视图结束时加载数据。在您的片段中实施 OnScrollListener。参考这个 link Android - ListView to load more items when reached end

列表视图XMl:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ListView
        android:id="@+id/orderlistview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        />

</LinearLayout>

订单列表class

public class OrderList {

    int _orderId;
    int _orderincrement_id;
    String _orderstatus;
    String _orderdate;
    String _ordership_to;
    String _ordertotal;
    String _ordercurrency_symbol;

    // Empty constructor
    public OrderList() {

    }

    // constructor
    public OrderList(int _orderId, int _orderincrement_id, String _orderstatus,
            String _orderdate, String _ordership_to, String _ordertotal,
            String _ordercurrency_symbol) {
        this._orderId = _orderId;
        this._orderincrement_id = _orderincrement_id;
        this._orderstatus = _orderstatus;
        this._orderdate = _orderdate;
        this._ordership_to = _ordership_to;
        this._ordertotal = _ordertotal;
        this._ordercurrency_symbol = _ordercurrency_symbol;

    }

    public int get_orderId() {
        return _orderId;
    }

    public void set_orderId(int _orderId) {
        this._orderId = _orderId;
    }

    public int get_orderincrement_id() {
        return _orderincrement_id;
    }

    public void set_orderincrement_id(int _orderincrement_id) {
        this._orderincrement_id = _orderincrement_id;
    }

    public String get_orderstatus() {
        return _orderstatus;
    }

    public void set_orderstatus(String _orderstatus) {
        this._orderstatus = _orderstatus;
    }

    public String get_orderdate() {
        return _orderdate;
    }

    public void set_orderdate(String _orderdate) {
        this._orderdate = _orderdate;
    }

    public String get_ordership_to() {
        return _ordership_to;
    }

    public void set_ordership_to(String _ordership_to) {
        this._ordership_to = _ordership_to;
    }

    public String get_ordertotal() {
        return _ordertotal;
    }

    public void set_ordertotal(String _ordertotal) {
        this._ordertotal = _ordertotal;
    }

    public String get_ordercurrency_symbol() {
        return _ordercurrency_symbol;
    }

    public void set_ordercurrency_symbol(String _ordercurrency_symbol) {
        this._ordercurrency_symbol = _ordercurrency_symbol;
    }

}

Activity

public class OrderListFragment extends Fragment {

    View rootView;
    ListView lv;
    List<OrderList> list ;
    MyListAdapter adt;
    DatabaseHandler db ;
    ProgressDialog progress;
    SharedPreferences pref;

    public OrderListFragment() {
    }

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

        rootView = inflater.inflate(R.layout.fragmentorderlist, container,
                false);

        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        lv = (ListView) rootView.findViewById(R.id.orderlistview);


        db = new DatabaseHandler(getActivity());
        list = db.getAllOrderList();
        if(list.size() == 0){
            progress = new ProgressDialog(getActivity());
            progress.setMessage("Fetching Data.....");
            progress.setIndeterminate(true);
            progress.setCancelable(false);
            progress.show();

            pref = PreferenceManager.getDefaultSharedPreferences(getActivity());

            String customer_id = pref.getString("customer_id", null);

            Log.v("log_tag", "customer_id"+customer_id);
            if(customer_id != null){
                Log.v("log_tag", "customer_id 2332 ::: "+customer_id);
                new FetchOrderListData().execute(customer_id);
            }
        }
        adt = new MyListAdapter(getActivity());
        lv.setAdapter(adt);

        lv.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> a, View v, int position,
                        long id) {

                    Bundle bundle = new Bundle();
                    bundle.putString("orderlist_increment_id", list.get(position).get_orderincrement_id()+"");
                    Fragment fragment = new OrderdetailFragment();
                    fragment.setArguments(bundle);
                    FragmentManager fragmentManager = OrderListFragment.this
                            .getActivity().getSupportFragmentManager();
                    FragmentTransaction mFragmentTransaction = fragmentManager
                            .beginTransaction();
                    mFragmentTransaction.addToBackStack(null);
                    mFragmentTransaction.replace(R.id.Frame_Layout, fragment)
                            .commit();

                }
            });

        return rootView;
    }

    public class MyListAdapter extends BaseAdapter {
        private LayoutInflater mInflater;

        public MyListAdapter(Context context) {
            mInflater = LayoutInflater.from(context);

        }

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

        public Object getItem(int position) {
            return position;
        }

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

        public View getView(final int position, View convertView,
                ViewGroup parent) {
            convertView = mInflater.inflate(R.layout.custom_orderlistdata,
                    null);
            TextView ordernumbertxt = (TextView) convertView
                    .findViewById(R.id.ordernumberTxt);
            TextView orderdate = (TextView) convertView
                    .findViewById(R.id.orderdateTxt);
            TextView orderamount = (TextView) convertView
                    .findViewById(R.id.orderAmountTxt);
            TextView orderSatusTxt = (TextView) convertView
                    .findViewById(R.id.orderSatusTxt);

            ordernumbertxt.setText(Html.fromHtml("<b>Order Number : </b>"+list.get(position).get_orderincrement_id()+""));
            orderdate.setText(list.get(position).get_orderdate());
            orderSatusTxt.setText(list.get(position).get_orderstatus());
            String parts = list.get(position).get_ordertotal(); 

            double d = Double.parseDouble(parts);
            double dval = roundTwoDecimals(d);
            orderamount.setText(Html.fromHtml("<b>Total  : </b>"+list.get(position).get_ordercurrency_symbol()+" "+dval));

            return convertView;
        }

         public double roundTwoDecimals(double d) {
              DecimalFormat twoDForm = new DecimalFormat("#.##");
              return Double.valueOf(twoDForm.format(d));
            }
    }

    private class FetchOrderListData extends AsyncTask<String, Void, JSONObject> {
        @Override
        protected void onPreExecute() {

        }

        @Override
        protected JSONObject doInBackground(String... args) {
            JSONObject listSize = null;

            Integer cust_id = Integer.parseInt(args[0]);
            try {
                listSize = DBAda.getAllOrderListData(cust_id);
                ////*** call your HTTP Service over here ***////
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return listSize;
        }

        protected void onPostExecute(JSONObject jsonObj) {
            db = new DatabaseHandler(getActivity());
            if (progress != null) {
                progress.hide();
            }
            if (jsonObj == null) {

                return;
            }



            JSONArray json;

            try {
                json = jsonObj.getJSONArray("records");

                for (int i = 0; i < json.length(); i++) {
                    JSONObject jobj;
                    try {
                        jobj = json.getJSONObject(i);
                        int order_id = Integer.parseInt(jobj.getString("order_id").toString());
                        int order_IncrementId = Integer.parseInt(jobj.getString("increment_id").toString());
                        String orderStatus = jobj.getString("status");
                        String orderdate = jobj.getString("date");
                        String ordershipto = jobj.getString("ship_to");
                        String ordertotal = jobj.getString("order_total");
                        String ordersymbol = jobj.getString("currency_symbol");

                        //db.addWishlistItem(new WishList(entity_id,quentity,comment,name,short_description,thumbnails,itemId));

                        db.addOrderListItem(new OrderList(order_id, order_IncrementId, orderStatus, orderdate, ordershipto, ordertotal, ordersymbol));



                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            lv = (ListView) rootView.findViewById(R.id.orderlistview);


            db = new DatabaseHandler(getActivity());
            list = db.getAllOrderList();
            adt = new MyListAdapter(getActivity());
            lv.setAdapter(adt);

        }
    }


}

您没有在 Fragment 中使用 EndlessListView。当我查看您的回复时,它包括分页。因此,您需要请求页码才能使用无限滚动。

这只是 Endless Listview 的流程。如果您的代码仍然无法运行,希望您在阅读此消息后能够学习示例项目。我只添加了你需要的部分。谢谢

Endless scroll only shows limited data on listview. When user scroll down to bottom, it will get next limited data from server. So you need to add current_page paramater in your request. I don't know exactly your api.

首先,您需要 current_page 的变量,它初始化为 0

你必须知道什么时候停止。您的回复有 total_page 字段。保存并添加验证

然后您需要知道何时请求下一页。为此,您在 EndlessListView 中的 onScroll 中已有代码。该代码计算并告诉用户何时向下滚动到底部并调用

listener.loadData();

请求新数据。但是您仍然需要为此添加侦听器。您已经

public void setListener(EndLessListener listener) {
    this.listener = listener;
} 

You need to create Interface with the name EndlessListener and implements in your fragment. EndlessListener Interface will include loadData() function that request to server. After that you need to add listener for the listview.

endlessListView.setListener(this);

您可以使用 Github

中的以下库来实现此目的

https://github.com/nicolasjafelle/PagingListView

简单地创建您的 PagingAdapter 并将其添加到 com.paging.listview.PagingListView。 您必须实现新的 Pagable 接口及其 onLoadMoreItems() 方法。例如:

listView.setHasMoreItems(true);
listView.setPagingableListener(new PagingListView.Pagingable() {
    @Override
    public void onLoadMoreItems() {
        if (pager < 3) {
            new CountryAsyncTask(false).execute();
        } else {
            listView.onFinishLoading(false, null);
        }
    }
});

终于可以使用onFinishLoading(boolean hasMoreItems, List newItems)方法更新列表了。

listView.onFinishLoading(true, newItems);

另外记得在布局文件中使用这个包:

<com.paging.listview.PagingListView
    android:id="@+id/paging_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

你好这里可以找到懒加载的nostra库然后就可以了 为延迟加载实现以下示例

https://github.com/nostra13/Android-Universal-Image-Loader

你可以通过下面的方式实现延迟加载

代码

让我们开始编写有关延迟加载的代码。

MainActivity.java


    package com.sunil.lazyloading;


    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;


public class MainActivity extends Activity implements OnClickListener{

    private Button btnlist=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnlist= (Button)findViewById(R.id.button_listview);
        btnlist.setOnClickListener(this);
    }
    @Override
    public void onClick(View arg0) {

        Intent intent = new Intent(this, ImageListActivity.class);
        intent.putExtra("stringarrayimage", Constants.IMAGES);
        startActivity(intent);

    }

}
CustomAdapter.java


    package com.sunil.adapter;

    import java.util.Collections;
    import java.util.LinkedList;
    import java.util.List;

    import com.nostra13.universalimageloader.core.DisplayImageOptions;
    import com.nostra13.universalimageloader.core.ImageLoader;
    import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
    import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
    import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
    import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
    import com.sunil.lazyloading.R;

    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;



public class CustomAdapter extends BaseAdapter{

    private String imageurl[]=null;
    private Context context=null;
    DisplayImageOptions doption=null;
    private ImageLoadingListener animateFirstListener =null;


    public CustomAdapter(Activity activity, String[] imageurl)
    {
        this.context=activity;
        this.imageurl=imageurl;
        doption=new DisplayImageOptions.Builder().showImageForEmptyUri(R.drawable.ic_empty).showImageOnFail(R.drawable.ic_error).showStubImage(R.drawable.ic_stub).cacheInMemory(true).cacheOnDisc(true).displayer(new RoundedBitmapDisplayer(20)).build();
        animateFirstListener = new AnimateFirstDisplayListener();
    }

    @Override
    public int getCount() {
        return imageurl.length;
    }

    @Override
    public Object getItem(int arg0) {
        return arg0;
    }

    @Override
    public long getItemId(int arg0) {
        return arg0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view = convertView;
        final ViewHolder holder;

        if (convertView == null) {
            view = ((Activity) context).getLayoutInflater().inflate(R.layout.item_list_row, parent, false);
            holder = new ViewHolder();
            holder.text = (TextView) view.findViewById(R.id.text);
            holder.image = (ImageView) view.findViewById(R.id.image);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

        holder.text.setText("Item " + (position + 1));
        ImageLoader imageLoader = ImageLoader.getInstance();
        imageLoader.displayImage(imageurl[position], holder.image, doption, animateFirstListener);

        return view;
    }

    private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

        static final List<string> displayedImages = Collections.synchronizedList(new LinkedList<string>());

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 500);
                    displayedImages.add(imageUri);
                }
            }
        }
    }

    private class ViewHolder {
        public TextView text;
        public ImageView image;
    }
}
</string></string>
ImageListActivity.java

    package com.sunil.lazyloading;



        import java.util.Collections;
        import java.util.LinkedList;
        import java.util.List;

        import android.app.Activity;
        import android.content.Intent;
        import android.graphics.Bitmap;
        import android.os.Bundle;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.view.View;
        import android.widget.AdapterView;
        import android.widget.AdapterView.OnItemClickListener;
        import android.widget.ImageView;
        import android.widget.ListView;

        import com.nostra13.universalimageloader.core.ImageLoader;
        import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
MainActivity.java


    package com.sunil.lazyloading;


    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;


public class MainActivity extends Activity implements OnClickListener{

    private Button btnlist=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnlist= (Button)findViewById(R.id.button_listview);
        btnlist.setOnClickListener(this);
    }
    @Override
    public void onClick(View arg0) {

        Intent intent = new Intent(this, ImageListActivity.class);
        intent.putExtra("stringarrayimage", Constants.IMAGES);
        startActivity(intent);

    }

}
CustomAdapter.java


    package com.sunil.adapter;

    import java.util.Collections;
    import java.util.LinkedList;
    import java.util.List;

    import com.nostra13.universalimageloader.core.DisplayImageOptions;
    import com.nostra13.universalimageloader.core.ImageLoader;
    import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
    import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
    import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
    import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
    import com.sunil.lazyloading.R;

    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;



public class CustomAdapter extends BaseAdapter{

    private String imageurl[]=null;
    private Context context=null;
    DisplayImageOptions doption=null;
    private ImageLoadingListener animateFirstListener =null;


    public CustomAdapter(Activity activity, String[] imageurl)
    {
        this.context=activity;
        this.imageurl=imageurl;
        doption=new DisplayImageOptions.Builder().showImageForEmptyUri(R.drawable.ic_empty).showImageOnFail(R.drawable.ic_error).showStubImage(R.drawable.ic_stub).cacheInMemory(true).cacheOnDisc(true).displayer(new RoundedBitmapDisplayer(20)).build();
        animateFirstListener = new AnimateFirstDisplayListener();
    }

    @Override
    public int getCount() {
        return imageurl.length;
    }

    @Override
    public Object getItem(int arg0) {
        return arg0;
    }

    @Override
    public long getItemId(int arg0) {
        return arg0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view = convertView;
        final ViewHolder holder;

        if (convertView == null) {
            view = ((Activity) context).getLayoutInflater().inflate(R.layout.item_list_row, parent, false);
            holder = new ViewHolder();
            holder.text = (TextView) view.findViewById(R.id.text);
            holder.image = (ImageView) view.findViewById(R.id.image);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

        holder.text.setText("Item " + (position + 1));
        ImageLoader imageLoader = ImageLoader.getInstance();
        imageLoader.displayImage(imageurl[position], holder.image, doption, animateFirstListener);

        return view;
    }

    private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

        static final List<string> displayedImages = Collections.synchronizedList(new LinkedList<string>());

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 500);
                    displayedImages.add(imageUri);
                }
            }
        }
    }

    private class ViewHolder {
        public TextView text;
        public ImageView image;
    }
}
</string></string>
ImageListActivity.java

    package com.sunil.lazyloading;



        import java.util.Collections;
        import java.util.LinkedList;
        import java.util.List;

        import android.app.Activity;
        import android.content.Intent;
        import android.graphics.Bitmap;
        import android.os.Bundle;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.view.View;
        import android.widget.AdapterView;
        import android.widget.AdapterView.OnItemClickListener;
        import android.widget.ImageView;
        import android.widget.ListView;

        import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
        import com.sunil.adapter.CustomAdapter;


public class ImageListActivity extends Activity implements OnItemClickListener{

    private ListView listview=null;
    private String[] imageUrls;
    protected ImageLoader imageLoader=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.imagelist);

        listview=(ListView)findViewById(R.id.listView_image);
        imageLoader = ImageLoader.getInstance();
        Bundle bundle = getIntent().getExtras();
        imageUrls = bundle.getStringArray("stringarrayimage");
        CustomAdapter adapter=new CustomAdapter(ImageListActivity.this, imageUrls);
        listview.setAdapter(adapter);

        listview.setOnItemClickListener(this);

    }
    @Override
    public void onItemClick(AdapterView arg0, View arg1, int position, long arg3) {
        Intent intent = new Intent(this, ImagePagerActivity.class);
        intent.putExtra("imageurlpostion", imageUrls);
        intent.putExtra("imagepostion", position);
        startActivity(intent);

    }

    @Override
    public void onBackPressed() {
        AnimateFirstDisplayListener.displayedImages.clear();
        super.onBackPressed();
    }


    private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

        static final List<string> displayedImages = Collections.synchronizedList(new LinkedList<string>());

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 500);
                    displayedImages.add(imageUri);
                }
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item_clear_memory_cache:
                imageLoader.clearMemoryCache();
                return true;
            case R.id.item_clear_disc_cache:
                imageLoader.clearDiscCache();
                return true;
            default:
                return false;
        }
    }
}

activity_main.xml

<button android:id="@+id/button_listview" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="ListView ImageLoad">

imagelist.xml

<listview android:id="@+id/listView_image" android:layout_height="match_parent" android:layout_width="match_parent">
</listview>

item_list_row.xml

<imageview android:adjustviewbounds="true" android:contentdescription="@string/descr_image" android:id="@+id/image" android:layout_height="72dip" android:layout_margin="3dip" android:layout_width="72dip" android:scaletype="centerCrop">

<textview android:id="@+id/text" android:layout_gravity="left|center_vertical" android:layout_height="wrap_content" android:layout_marginleft="20dip" android:layout_width="fill_parent" android:textsize="22sp">

对于上面的示例,您需要下载库通用图像加载器,您可以下载库...快乐编码:)

必须使用Paging 3 library以最简单的方式解决所有问题。