2014-04-20 1 views
0

헤더가있는 ListView를 구현하는 Adapter 클래스가 있습니다.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 등)의 구현을 이해하고 있습니다.

위의 코드는 원활히 실행하지만 난 이해하지 않는 우리는 방법

  • addItem를
  • addSeparatorItem
  • getItemViewType
  • getViewTypeCount
  • 주는 getItemId
  • getCount를 사용하는 이유

누구나 시나리오를 명확하게 설명 할 수 있습니다!

미리 감사드립니다.

답변

0

이들은 모두 콜백 메소드입니다. 아래 링크에서 이러한 메소드에 대한 명확한 정의를 가질 수 있습니다.

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

은 내가 당신에게 준 getItem의 예()을 드리겠습니다

새로운 목록보기 행이 생성 될 때마다, adapte이 다시 전화 방법에서 항목 세부 정보를 얻을 잡아 줄께.

마찬가지로 list가 생성 될 때마다 getCount()가 호출됩니다.

listview에 12 개의 항목이 있다고 가정합니다. 하지만 getCount()에서 10을 전달합니다. 목록보기에는 10 개의 항목 만 표시됩니다.

+0

나는 그들의 요점을 이해하지 못한다, 그들은 또한 좋은 설명이 없다. –