MultiAdapter.java :  » Web » droidstack » org » droidstack » adapter » Android Open Source

Android Open Source » Web » droidstack 
droidstack » org » droidstack » adapter » MultiAdapter.java
package org.droidstack.adapter;

import java.util.ArrayList;

import android.content.Context;
import android.util.SparseIntArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.AdapterView.OnItemClickListener;

public class MultiAdapter extends BaseAdapter implements OnItemClickListener {
  private static final int NO_SUCH_ITEM = -1;
  // this hack is needed because the current implementation of ListView
  // only calls this method ONCE, when setAdapter() is called.
  // Calling notifyDataSetChanged() does not reset the cached return value
  // of this method that ListView holds
  private static final int VIEW_TYPE_COUNT = 10;
  
  private final Context context;
  
  private final ArrayList<MultiItem> listItems;
  private final SparseIntArray viewTypes;
  
  private int viewTypeCount;
  
  public static abstract class MultiItem {
    public abstract int getLayoutResource();
    
    public boolean isEnabled() { return true; }
    
    public void onClick() {}
    
    public abstract void bindView(View view, Context context);
    public abstract View newView(Context context, ViewGroup parent);
  }
  
  public MultiAdapter(Context context, int viewTypeCount) {
    this.context = context;
    
    listItems = new ArrayList<MultiAdapter.MultiItem>();
    viewTypes = new SparseIntArray();
    
    this.viewTypeCount = viewTypeCount;
  }
  
  public MultiAdapter(Context context) {
    this(context, VIEW_TYPE_COUNT);
  }
  
  public void addItem(MultiItem item) {
    int resource = item.getLayoutResource();
    
    if (resource != IGNORE_ITEM_VIEW_TYPE) {
      if (viewTypes.get(resource, NO_SUCH_ITEM) == NO_SUCH_ITEM) {
        // Resource not already added, add it
        viewTypes.append(resource, viewTypes.size());
      }
    }
    
    listItems.add(item);
  }
  
  public void clear() {
    listItems.clear();
  }
  
  @Override
  public boolean areAllItemsEnabled() {
    return false;
  }
  
  @Override
  public int getItemViewType(int position) {
    final MultiItem item = listItems.get(position);
    
    int resource = item.getLayoutResource();
    
    return resource != IGNORE_ITEM_VIEW_TYPE ? viewTypes.get(resource) : IGNORE_ITEM_VIEW_TYPE;
  }

  @Override
  public int getViewTypeCount() {
    return viewTypeCount;
  }

  @Override
  public boolean isEmpty() {
    return listItems.isEmpty();
  }

  @Override
  public boolean isEnabled(int position) {
    return listItems.get(position).isEnabled();
  }
  
  @Override
  public int getCount() {
    return listItems.size();
  }

  @Override
  public Object getItem(int position) {
    return listItems.get(position);
  }

  @Override
  public long getItemId(int position) {
    // Position is the same as id in our case
    return position;
  }

  @Override
  public View getView(int position, View v, ViewGroup parent) {
    final MultiItem item = listItems.get(position);
    
    if (v == null) {
      v = item.newView(context, parent);
    }
    
    item.bindView(v, context);
    
    return v;
  }

  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    listItems.get(position).onClick();
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.