2013-05-09 36 views
3

我有一個ListView,所以我想,這樣它堅持到ListView的頂部,當不同類別在ListView開始不同的頁眉需要它的地方,像聯繫人添加粘頭,哪裏是「一個「作爲一個粘性標題是在頂部,直到」B「進來。 有沒有任何圖書館呢? 我使用自定義列表適配器來顯示我的表...如何將粘性標題添加到我的ListView?

,這是我的自定義適配器類需要

public class NewsRowAdapter extends ArrayAdapter<Item> { 

private Activity activity; 
private List<Item> items; 
private Item objBean; 
private int row; 

private DisplayImageOptions options; 
ImageLoader imageLoader; 

public NewsRowAdapter(Activity act, int resource, List<Item> arrayList) { 
    super(act, resource, arrayList); 
    this.activity = act; 
    this.row = resource; 
    this.items = arrayList; 



    imageLoader = ImageLoader.getInstance(); 
    File cacheDir1 = StorageUtils.getCacheDirectory(activity); 

    ImageLoaderConfiguration config = new 
    ImageLoaderConfiguration.Builder(activity) 
    .maxImageWidthForMemoryCache(600) 
    .maxImageHeightForMemoryCache(400) 
    .httpConnectTimeout(5000) 
    .httpReadTimeout(20000) 
    .threadPoolSize(3) 
    .threadPriority(Thread.MIN_PRIORITY + 3) 
    .denyCacheImageMultipleSizesInMemory() 
    .memoryCache(new UsingFreqLimitedMemoryCache(20000)) // You can pass your own memory cache implementation 
    .discCache(new TotalSizeLimitedDiscCache(cacheDir1, 30000)) // You can pass your own disc cache implementation 
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) 
    .build(); 


    ImageLoader.getInstance().init(config); 
//    imageLoader = ImageLoader; 
//  

    options = new DisplayImageOptions.Builder() 
    .showStubImage(R.drawable.icon2x) 
    .showImageForEmptyUrl(R.drawable.icon2x).cacheInMemory() 
    .cacheOnDisc().build(); 
//imageLoader = ImageLoader.getInstance(); 

} 

@Override 
public Item getItem(int position) 
{ 
    return items.get(position); 
} 

@Override 
public int getCount() 
{ 
    return items.size(); 
} 

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

@Override 
public int getItemViewType(int position) 
{ 
    Item item = items.get(position); 
    if (item.isHeader()) 
    { 
     return TYPE_SECTION_HEADER; 
    } 
    else 
    { 
     return TYPE_LIST_ITEM; 
    } 
} 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    ViewHolder holder; 
    if (view == null) { 
     LayoutInflater inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(row, null); 

     holder = new ViewHolder(); 
     view.setTag(holder); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 

    if ((items == null) || ((position + 1) > items.size())) 
     return view; 

    objBean = items.get(position); 

    holder.tvName = (TextView) view.findViewById(R.id.title); 
    holder.tvId = (TextView) view.findViewById(R.id.id); 
    holder.tvFlag = (TextView) view.findViewById(R.id.flag); 
    holder.tvimageurl=(TextView) view.findViewById(R.id.imageurl); 
    holder.tvGender = (ImageView) view.findViewById(R.id.image); 
    //holder.tvAge = (TextView) view.findViewById(R.id.tvage); 
    holder.pbar = (ProgressBar) view.findViewById(R.id.pbar); 
    if (holder.tvName != null && null != objBean.getName() 
      && objBean.getName().trim().length() > 0) { 
     holder.tvName.setText(Html.fromHtml(objBean.getName())); 
    } 
    if (holder.tvId != null && null != objBean.getId() 
      && objBean.getId().trim().length() > 0) { 
     holder.tvId.setText(Html.fromHtml(objBean.getId())); 

    } 
    if (holder.tvFlag != null && null != objBean.getFlag() 
      && objBean.getFlag().trim().length() > 0) { 
     holder.tvFlag.setText(Html.fromHtml(objBean.getFlag())); 

    } 

    if (holder.tvimageurl != null && null != objBean.getGender() 
      && objBean.getFlag().trim().length() > 0) { 
     holder.tvimageurl.setText(Html.fromHtml(objBean.getGender())); 

    } 

    //if (holder.tvBDate != null && null != objBean.getBirthdate() 
    //  && objBean.getBirthdate().trim().length() > 0) { 
    // holder.tvBDate.setText(Html.fromHtml(objBean.getBirthdate())); 
    //} 
    if (holder.tvGender != null) { 
     if (null != objBean.getGender() 
       && objBean.getGender().trim().length() > 0) { 
      final ProgressBar pbar = holder.pbar; 


      imageLoader.displayImage(objBean.getGender(), holder.tvGender, 
        options, new ImageLoadingListener() { 

         @Override 
         public void onLoadingComplete() { 
          pbar.setVisibility(View.INVISIBLE); 

         } 


         @Override 
         public void onLoadingFailed() { 
          pbar.setVisibility(View.INVISIBLE); 
         } 


         @Override 
         public void onLoadingStarted() { 
          pbar.setVisibility(View.INVISIBLE); 

         } 
        }); 

     } else { 
      holder.tvGender.setImageResource(R.drawable.icon2x); 
     } 
    } 


    return view; 
} 

public class ViewHolder { 
    public TextView tvimageurl; 
    public TextView tvFlag; 
    public TextView tvId; 
    public ProgressBar pbar; 
    public TextView tvName, tvCity, tvBDate, tvAge; 
    ImageView tvGender; 
} 


} 

幫助.....

+0

看到我的答案在http://stackoverflow.com/questions/6827712/how-can-i-implement-adapter-for-my-list-view-to-show-iphonis-contacts-list/14473305#14473305 – 2013-05-09 08:04:34

+0

實際上,我不是在尋找字母索引器,我有其他的名字應該是標題.... – Saad 2013-05-09 08:08:45

+0

檢查給定的屏幕截圖。還有自定義標頭tooo ....給予庫支持定製heders也。不僅單個字母字符.. – 2013-05-09 08:10:43

回答

5

有一個庫恰與該名稱實現你想要什麼:

Library demo image

你可以看看這裏:https://github.com/emilsjolander/StickyListHeaders

+0

我正在努力與圖書館。我可以將這個庫用於多個數據類型而不是單個數據類型嗎? – Scorpion 2016-03-04 12:16:14

+0

我從來沒有嘗試過。但我相信你可能不得不改變一下它的代碼來工作。 – neteinstein 2016-03-04 12:27:57

+0

我掙扎了2天以上,基本上有3種。 1-字符串 2-自定義類 3-標頭 現在在getview中我必須檢查我得到的是哪種類型,我想跳過標題項,但是當類型是標題時我可以返回空視圖,我得到2-3頭項目..任何關於這方面的幫助對我來說真的很棒.. – Scorpion 2016-03-04 12:40:54

7

我掙扎着相當長的時間寫我自己的StickyHeader爲StickyListHeaders git的不完美匹配我的需求。然而,StickyListHeaders幫助我瞭解如何最終使其工作,因此StickyListHeaders的作者值得一提。

很多事情都要放在一起有粘頭工作。

首先聲明以下

private TextView mStickyHeader; 
private TextView mStickyHeader2; 
private int mCurrentStickyHeaderSection; 

onActivityCreated

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    ...  
    mCurrentStickyHeaderSection = -1; 

    mStickyHeader = (TextView) getView().findViewById(R.id.textview_sticky_header_section); 
    mStickyHeader2 = (TextView) getView().findViewById(R.id.textview_sticky_header_section_2); 

    mListView = (ListView) getView().findViewById(R.id.listView_with_sticky_headers); 
    mListView.setOnScrollListener(new OnScrollListener() { 
     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
      updateStickyHeader(firstVisibleItem); 
     } 

     @Override 
     public void onScrollStateChanged(AbsListView arg0, int arg1) { 
      // TODO Auto-generated method stub 
     } 
    }); 

我假定你已經寫了CustomAdapter第指標,將只專注於粘頭。

下面的方法包含了所有你需要有什麼stickyheader。棘手的部分是確定firstVisibleItem是否是頭(pos = -1)以及相應的部分。這部分可能需要你幾次才能正常工作。

private void updateStickyHeader(int firstVisibleItem) { 
    // here is the tricky part. You have to determine pos and section 
    // pos is the position within a section pos = -1 means it's the header of the section   
    // you have to determine if firstVisibleItem is a header or not 
    // you also have to determine the section to which belongs the first item 
    int pos = whatIsThePositionOfTheItem[firstVisibleItem]; 
    int section = whatIsTheSectionOfTheItem[firstVisibleItem]; 

    if (section != mCurrentStickyHeaderSection) { 
     mStickyHeader.setText("Your_Previous_Section_Text"); 
     mStickyHeader2.setText("Your_Next_Section_Text"); 
     mCurrentStickyHeaderSection = section; 
    } 

    int stickyHeaderHeight = mStickyHeader.getHeight(); 
    if (stickyHeaderHeight == 0) { 
     stickyHeaderHeight = mStickyHeader.getMeasuredHeight(); 
    } 

    View SectionLastView = mListView.getChildAt(0); 
    if (SectionLastView != null && pos == -1 && SectionLastView.getBottom() <= stickyHeaderHeight) { 
     int lastViewBottom = SectionLastView.getBottom(); 
     mStickyHeader.setTranslationY(lastViewBottom - stickyHeaderHeight); 
     mStickyHeader2.setTranslationY(lastViewBottom - stickyHeaderHeight + mStickyHeader.getHeight()); 
    } else if (stickyHeaderHeight != 0) { 
     mStickyHeader.setTranslationY(0); 
     mStickyHeader2.setTranslationY(mStickyHeader.getHeight()); 
    } 
} 

最後,佈局必須包含的FrameLayout和看起來應該

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

    //this textview is just a global title of your listview if you need one but can be remove 
    <TextView 
     android:id="@+id/textview_title" 
     style="?android:attr/listSeparatorTextViewStyle" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:paddingLeft="6dp" 
     android:paddingRight="6dp" 
     android:textIsSelectable="False" /> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <TextView 
      android:id="@+id/textview_sticky_header_section" 
      style="?android:attr/listSeparatorTextViewStyle" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:paddingLeft="6dp" 
      android:paddingRight="6dp" 
      android:textIsSelectable="False" /> 

     <TextView 
      android:id="@+id/textview_sticky_header_section_2" 
      style="?android:attr/listSeparatorTextViewStyle" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:paddingLeft="6dp" 
      android:paddingRight="6dp" 
      android:textIsSelectable="False" /> 
    </FrameLayout> 

    <ListView 
     android:id="@+id/listView_with_sticky_header" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fastScrollEnabled="true" 
     android:longClickable="true" > 
    </ListView> 

</LinearLayout> 

更新

至於問這裏的評論是whatIsThePositionOfTheItemwhatIsTheSectionOfTheItem的解釋。這些方法必須返回給定項目的positionsection

對我來說,這是很簡單的,我的數據已經包含了sectionposition。實際上,我正在顯示文字,並且文字以sectionposition開頭。所以我簡單地解析該文本以確定sectionposition

對於其他人來說,這是很難給出一個例子,因爲它真的取決於你是什麼顯示。但要長話短說whatIsThePositionOfTheItemwhatIsTheSectionOfTheItem必須返回給定項目的位置和部分。您可能需要填寫表中每個項目的positionsection,並從該表中獲取positionsection

+0

你是什麼意思 int pos = whatIsThePositionOfTheItem [firstVisibleItem]; int section = whatIsTheSectionOfTheItem [firstVisibleItem]; – Gaurav 2015-08-23 12:55:23

+0

@Gaurav閱讀我的更新 – HpTerm 2015-08-24 06:58:02

+0

我可以將此解決方案添加到Expandable列表視圖嗎? – Tony 2016-01-20 16:31:50

相關問題