2013-09-09 3 views
0

Привет, я пытаюсь использовать класс PinnedHeaderListView, чтобы получить представление списка с заголовками, так же как contacts app в Android.Android PinnedHeaderListView заголовки не привязаны

Заголовки отображаются в порядке, однако при прокрутке они не прикрепляются к вершине, как в приложении для контактов. вместо этого они просто прокручиваются, как обычно, listview.

Как я могу это исправить?

Вот отрывок из моего фрагмента и адаптера классов:

public class StaffSectionFragment extends ListFragment implements 
    ActionBar.TabListener { 
private ListFragment mFragment; 
private StaffListAdapter adapter; 
private ArrayList<Staff> staffList; 

public StaffSectionFragment() { 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Get the view from fragment_courses.xml 
    getActivity().setContentView(R.layout.fragment_staff); 

    adapter = new StaffListAdapter(); 
    LayoutInflater inflator = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    RelativeLayout layout = (RelativeLayout) inflator.inflate(R.layout.fragment_staff, null); 

    PinnedHeaderListView listview =(PinnedHeaderListView) layout.findViewById(R.id.pinnedListView); 
    setListAdapter(adapter); 
    listview.setAdapter(adapter); 

} 


private void setupListView() 
{ 

} 

public class StaffListAdapter extends SectionedBaseAdapter { 

    @Override 
    public Object getItem(int section, int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int section, int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public int getSectionCount() { 
     //*************DO THIS***************** 
     // TODO Auto-generated method stub 
     return 2; 
    } 

    @Override 
    public int getCountForSection(int section) { 
     //*************DO THIS***************** 
     // TODO Auto-generated method stub 
     return 20; 
    } 

    @Override 
    public View getItemView(int section, int position, View convertView, 
      ViewGroup parent) { 
     // TODO Auto-generated method stub 
     LinearLayout layout = null; 
     if(convertView == null) 
     { 
      LayoutInflater inflator = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      layout = (LinearLayout) inflator.inflate(R.layout.list_item, null); 
     } 
     else 
     { 
      layout = (LinearLayout)convertView; 
     } 
     //set item 
     ((TextView) layout.findViewById(R.id.listtextItem)).setText("Section " + section + " item " + position); 
     return layout; 
    } 

    @Override 
    public View getSectionHeaderView(int section, View convertView, 
      ViewGroup parent) { 
     LinearLayout layout = null; 
     if(convertView == null) 
     { 
      LayoutInflater inflator = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      layout = (LinearLayout) inflator.inflate(R.layout.header_item, null); 
     } 
     else 
     { 
      layout = (LinearLayout)convertView; 
     } 
     //set item 
     ((TextView) layout.findViewById(R.id.headertextItem)).setText("Header for section " + section); 
     return layout; 
    }  
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    // Do something with the data 

} 

@Override 
public void onTabReselected(Tab arg0, FragmentTransaction arg1) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onTabSelected(Tab arg0, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
    mFragment = new StaffSectionFragment(); 
    // Attach fragment_courses.xml layout 
    ft.add(android.R.id.content, mFragment); 
    ft.attach(mFragment); 

} 

@Override 
public void onTabUnselected(Tab arg0, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
    // Remove fragment_courses.xml layout 
    ft.remove(mFragment); 

} 

} 

Может кто-нибудь помочь мне исправить это? благодаря!

+0

Ваш код выглядит хорошо. Я использую тот же код, но мой работает. Единственное отличие в том, что я использую Fragment вместо ListFragment. Возможно, причина. Вы должны иметь PinnedHeaderListView как ur listview в своем макете. Можете ли вы разместить здесь свой макет? – Rudi

ответ

0

Ваш адаптер должен выглядеть следующим образом: Сколько секций есть? эта реализация для одного раздела, если у вас есть 2 или более, сообщите мне, потому что вы должны переопределить другие методы.

 @Override 
     public Object getItem (int section, int position) 
     { 
      if(staffList != null){ 
       if(section == 0){ 
        if(position < staffList.size()){ 
         return staffList.get(position); 
        } else { 
         return // do your second section header 
        } 
       } 
      } 
      return null; 
     } 

     @Override 
     public long getItemId(int section, int position) { 
      return position; 
     } 


     @Override 
     public int getSectionCount() { 
     return 2; 
     } 

     @Override 
     public int getCountForSection(int section) { 
      if (staffList != null) { 
        if(section == 0) { 
      return staffList.size(); 
     } else { 
      return // your second section 
      } 
      } 
      return 0; 
     } 

     @Override 
     public int getItemViewType(int section, int position) { 

     if (section == 0 && staffList != null && position == staffList.size() + 1) { 
      return 1; 
     } else if (//do your second section) { 
      return 2; 
     } 
     return 0; 
    } 

    @Override 
    public int getSectionHeaderViewType(int section) { 
    return section; 
    } 

    @Override 
    public int getSectionHeaderViewTypeCount() { 
     return 2; 
    } 
+0

Спасибо, что ответили! да, у меня более двух разделов. какие методы мне нужно переопределить? – misterMan

+0

проверить, отредактировано, затем в вашем getItemView только что указан макет, который вы хотите раздуть для каждого раздела. Надеюсь, это помогло –