title: How to load 1000's of data in listview efficiently
body: <p>I have 1000's of customers to load in custom listview from server. But it takes more time for me to populate in listview. I am using search option to search the customers so I need to load and display all the customers at one shot. I cannot display it from the local database because I may edit the details on item click in listview and store it in server. Can any one help me loading in custom listview in an efficient way? </p>
  
  <pre><code>  public class CustomersAdapter extends ArrayAdapter&lt;Item&gt; {
  
  private ArrayList&lt;Item&gt; items;
  private LayoutInflater vi;
  private Item objItem;
  
  ViewHolderSectionName holderSection;
  ViewHolderName holderName;
  
  public CustomersAdapter(Context context, ArrayList&lt;Item&gt; items) {
      super(context, 0, items);
  
      this.items = items;
      vi = (LayoutInflater) context
              .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  }
  
  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
  
      objItem = items.get(position);
  
      if (objItem.isSectionItem()) {
          SectionHeadersModel si = (SectionHeadersModel) objItem;
  
          if (convertView == null
                  || !convertView.getTag().equals(holderSection)) {
              convertView = vi.inflate(R.layout.alphabet_separator, null);
  
              holderSection = new ViewHolderSectionName();
              convertView.setTag(holderSection);
          } else {
              holderSection = (ViewHolderSectionName) convertView.getTag();
          }
  
          holderSection.section = (TextView) convertView
                  .findViewById(R.id.alphabet_letter);
          holderSection.section.setText(si.getSectionString().toString());
  
      } else {
          CustomerListViewModel ei = (CustomerListViewModel) objItem;
  
          if (convertView == null || !convertView.getTag().equals(holderName)) {
              convertView = vi.inflate(R.layout.customer_list_item, null);
  
              holderName = new ViewHolderName();
              convertView.setTag(holderName);
          } else {
              holderName = (ViewHolderName) convertView.getTag();
          }
  
          holderName.name = (TextView) convertView
                  .findViewById(R.id.CustomerName);
          holderName.email = (TextView) convertView
                  .findViewById(R.id.CustomerEmail);
          holderName.phone = (TextView) convertView
                  .findViewById(R.id.CustomerPhone);
  
          if (holderName.name != null)
              holderName.name.setText(ei.getCustomerName());
          holderName.email.setText(ei.getCustomerEmail());
          holderName.phone.setText(ei.getCustomerPhone());
      }
      return convertView;
  }
  
  public static class ViewHolderName {
      public TextView name;
      public TextView email;
      public TextView phone;
  }
  
  public static class ViewHolderSectionName {
      public TextView section;
  }
  </code></pre>
  
  <p>}</p>