2014-04-20 44 views
0

我有一個Adapter類,它實現了帶有標題的ListView。ListView頭實現

//Adapter Class 
private class MyCustomAdapter extends BaseAdapter { 

private static final int TYPE_ITEM = 0; 
private static final int TYPE_SEPARATOR = 1; 
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1; 
private static final int TYPE_GRAY_SEPARATOR = 2; 
private TreeSet<Integer> mGraySeparatorsSet = new TreeSet<Integer>(); 

private ArrayList<ContentWrapper> mData = new ArrayList<ContentWrapper>(); 
private LayoutInflater mInflater; 

private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>(); 

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

public void addItem(ContentWrapper value) { 
    mData.add(value); 
    notifyDataSetChanged(); 
} 

public void addSeparatorItem(ContentWrapper value) { 
    mData.add(value); 
    // save separator position 
    mSeparatorsSet.add(mData.size() - 1); 
    notifyDataSetChanged(); 
} 


public ContentWrapper getItem(int position) { 
    return mData.get(position); 
} 
@Override 
public int getItemViewType(int position) { 
    return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; 
} 

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

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

public long getItemId(int position) { 
    Log.v("getItemId Position", ""+position); 
    return position; 

} 

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    int type = getItemViewType(position); 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     switch (type) { 
     case TYPE_ITEM: 
      convertView = mInflater.inflate(R.layout.white, null); 
      holder.textView = (TextView)convertView.findViewById(R.id.text); 
      break; 
     case TYPE_SEPARATOR: 
      convertView = mInflater.inflate(R.layout.black, null); 
      holder.textView = (TextView)convertView.findViewById(R.id.textSeparator); 
      break; 

     } 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder)convertView.getTag(); 
    } holder.textView.setText(mData.get(position).getItem()); 

    if (type == TYPE_ITEM) { 
     holder.textView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       AlertDialog.Builder x = new AlertDialog.Builder(getActivity()); 
         x.setIcon(R.drawable.ic_launcher) 

         .setTitle(mData.get(position).getItem()) 

         .setMessage(mData.get(position).getItemDescription()) 

         .setCancelable(true) 
         .setPositiveButton("OK", 
           new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface arg, 
              int arg1) { 
            } 
           }); 
       AlertDialog a = x.create(); 
       a.show(); 
      } 
       return null; 
       } 


      }); 
    } else { 
     holder.textView.setOnClickListener(null); 
    } 

return convertView; 
} 
} 
public static class ViewHolder { 
public TextView textView; 
} 

在此我真正理解getView方法(ViewHolder,convertView等)的實現。

上面的代碼運行smoothy,但我不明白,爲什麼我們使用的方法

  • 的addItem
  • addSeparatorItem
  • getItemViewType
  • getViewTypeCount
  • getCount將
  • getItemId

任何人都可以清楚地向我解釋場景!

在此先感謝..

回答

0

這些都是回調方法。您可以在下面提到的鏈接中明確定義這些方法。

http://developer.android.com/reference/android/widget/BaseAdapter.html

讓我給你()的getItem的例子

每當創建新的ListView行,adapte預訂購從中得到回調方法項目的詳細信息。

類似地,每當創建列表時,都會調用getCount()。

假設你在列表視圖中有12項。但是你在getCount()中傳遞10。它只會在列表視圖中顯示十個項目。

+0

我不明白他們的觀點,他們也沒有很好的解釋 –