How to implement endless scrolling listview

8.2k views Asked by At

I am creating an application in which I am parsing data using Json parsing. I've implemented listview and in my response i have totalpage and current page objects,

A new user will get items from the first page. While the user is scrolling through the listview, the list expands with items from the next page (and the next and the next etc.)

this is my response http://pastie.org/10259792

The following is code I've tried:

HomeFragment

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

            }


    }

EndlessAdapter

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

}

6

There are 6 answers

7
Hein Htet Aung On BEST ANSWER

you didn't use EndlessListView in your Fragment. As I looked your response, it includes pagination. So, you need to request with page number to use endless scroll.

This is just flow for Endless Listview. If your code still doesn't work, I hope you can learn sample projects after read this messages. I added only parts you need. Thanks

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.

First, you need variable for current_page which initialize with 0

You have to know when to stop. You response has total_page field for that. Save and add validation

Then you need to know when to request next page. For that,you already have codes in onScroll within EndlessListView. That code calculate and tell when user scroll down to bottom and it called

listener.loadData();

to request new data. But you still need to add listener for that. You already have

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);
1
Zahid On

Try Loading data when listview reaches it's end. Implement OnScrollListener in your fragment. Refer this link Android - ListView to load more items when reached end

0
Krupa Rudani On

ListView 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>

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

        }
    }


}
0
Timur On

You MUST use Paging 3 library to resolve all problems in simplest way.

2
kuljeet singh On

You can achieve this by using the following library in Github

https://github.com/nicolasjafelle/PagingListView

Simple create your PagingAdapter and add it to com.paging.listview.PagingListView. You have to implements the new Pagingable interface and its onLoadMoreItems() method. For example:

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

Finally you can use the onFinishLoading(boolean hasMoreItems, List newItems) method to update the list.

listView.onFinishLoading(true, newItems);

Also remember to use this package in your layout files:

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

Hello here you can find the nostra library for lazy loading and then you can implement the following example for lazzy loading

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

you can achieve Lazy loading by using the below

code

Lets start the coding about the lazy loading.

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">

For the Example above you need to download the library universal image loader you can download the library ... happy coding :)