2015-04-29 2 views
1

Привет всем :) Я создаю собственный Listview, , но если элементы более определенного счета, список выглядит странным. Предметы смешаны.андроид пользовательские элементы списка просмотра смешаны



Я добавил вещи, как это:

mItems.add(new VenuesListHeader("Barra")); 
mItems.add(new VenuesListItem("Olympic gold course")); 
mItems.add(new VenuesListItem("Pontal")); 
mItems.add(new VenuesListItem("Barra olympic park")); 
mItems.add(new VenuesListItem("Riocentro")); 

mItems.add(new VenuesListHeader("Copacabana")); 
mItems.add(new VenuesListItem("Beach volleyball arena")); 
mItems.add(new VenuesListItem("Flamengo park")); 
mItems.add(new VenuesListItem("Fort copacabana")); 
mItems.add(new VenuesListItem("Lagoa stadium")); 
mItems.add(new VenuesListItem("Marina da gloria")); 

mItems.add(new VenuesListHeader("Deodora")); 
mItems.add(new VenuesListItem("Drodora aquatics centre")); 
mItems.add(new VenuesListItem("Drodora stadium")); 
mItems.add(new VenuesListItem("Olympic equestrian centre")); 
mItems.add(new VenuesListItem("Olympic hockey centre")); 
mItems.add(new VenuesListItem("Olympic shooting centre")); 
mItems.add(new VenuesListItem("Youth arena")); 
mItems.add(new VenuesListItem("X-park")); 

mItems.add(new VenuesListHeader("Maracana")); 
mItems.add(new VenuesListItem("Olympic stadium")); 
mItems.add(new VenuesListItem("Sambodromo")); 
mItems.add(new VenuesListItem("Maracana")); 

Но начинается от элементов третьего заголовка перемешаны. (я попробовал несколько попыток, число заголовков не имеет решающего значения.)

enter image description here



Это мой код:

View mHeader; 
ListView mListView; 
ArrayList<Item> mItems; 
VenuesListAdapter mAdapter; 

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    //listview set list 
    mListView = (ListView)rootView.findViewById(R.id.venues_list); 
    mHeader = inflater.inflate(R.layout.rio2016_venues_map, mListView, false); 
    mItems = new ArrayList<>(); 

    setList("all"); 

    mAdapter = new VenuesListAdapter(getActivity(), mItems); 

    mListView.addHeaderView(mHeader); 
    mListView.setAdapter(mAdapter); 
} 


void setList(String type){ 
    switch (type){ 
     case "barra": 
      mItems.clear(); 
     case "all_barra": 
      mItems.add(new VenuesListHeader("Barra")); 
      mItems.add(new VenuesListItem("Olympic gold course")); 
      mItems.add(new VenuesListItem("Pontal")); 
      mItems.add(new VenuesListItem("Barra olympic park")); 
      mItems.add(new VenuesListItem("Riocentro")); 
      break; 

     case "copacabana": 
      mItems.clear(); 
     case "all_copacabana": 
      mItems.add(new VenuesListHeader("Copacabana")); 
      mItems.add(new VenuesListItem("Beach volleyball arena")); 
      mItems.add(new VenuesListItem("Flamengo park")); 
      mItems.add(new VenuesListItem("Fort copacabana")); 
      mItems.add(new VenuesListItem("Lagoa stadium")); 
      mItems.add(new VenuesListItem("Marina da gloria")); 
      break; 

     case "deodoro": 
      mItems.clear(); 
     case "all_deodoro": 
      mItems.add(new VenuesListHeader("Deodora")); 
      mItems.add(new VenuesListItem("Drodora aquatics centre")); 
      mItems.add(new VenuesListItem("Drodora stadium")); 
      mItems.add(new VenuesListItem("Olympic equestrian centre")); 
      mItems.add(new VenuesListItem("Olympic hockey centre")); 
      mItems.add(new VenuesListItem("Olympic shooting centre")); 
      mItems.add(new VenuesListItem("Youth arena")); 
      mItems.add(new VenuesListItem("X-park")); 
      break; 

     case "maracana": 
      mItems.clear(); 
     case "all_maracana": 
      mItems.add(new VenuesListHeader("Maracana")); 
      mItems.add(new VenuesListItem("Olympic stadium")); 
      mItems.add(new VenuesListItem("Sambodromo")); 
      mItems.add(new VenuesListItem("Maracana")); 
      break; 

     case "all": 
      mItems.clear(); 
      setList("all_barra"); 
      setList("all_copacabana"); 
      setList("all_copacabana"); 
      setList("all_maracana"); 
      break; 
    } 
} 

Если вам нужно, это Пользовательский адаптер

public class VenuesListAdapter extends ArrayAdapter<Item>{ 

    private static final int TYPE_ITEM = 0; 
    private static final int TYPE_HEADER = 1; 

    private LayoutInflater mInflater; 

    public VenuesListAdapter(Context context, List<Item> items) { 
     super(context, 0, items); 
     mInflater = LayoutInflater.from(context); 
    } 

    public enum RowType { 
     LIST_ITEM, HEADER_ITEM 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return getItem(position).getViewType(); 
    } 

    @Override 
    public int getViewTypeCount() { 
     return RowType.values().length; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     int rowType = getItemViewType(position); 

     if(convertView == null){ 
      holder = new ViewHolder(); 

      switch (rowType){ 
       case TYPE_ITEM : 
        convertView = mInflater.inflate(R.layout.rio2016_venues_item, null); 
        holder.View = getItem(position).getView(mInflater, convertView); 
        break; 
       case TYPE_HEADER : 
        convertView = mInflater.inflate(R.layout.rio2016_venues_header, null); 
        holder.View = getItem(position).getView(mInflater, convertView); 
        break; 
      } 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     return convertView; 
    } 

    public static class ViewHolder { 
     public View View; 
    } 
} 

(Такая же проблема возникает даже в корыте без нас е рекурсивной функции)



Xml:.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ListView 
     android:id="@+id/venues_list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

элемент Адаптер Адаптер

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="10dp" 
    android:background="@color/white" 
    android:padding="15dp"> 


    <TextView 
     android:id="@+id/venues_list_item" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Text" 
     android:layout_centerVertical="true"/> 

</RelativeLayout> 

Заголовок:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="10dp" 
    android:paddingTop="5dp" 
    android:paddingBottom="5dp" 
    android:background="@color/nav_header_background"> 

    <TextView 
     android:id="@+id/venues_list_header" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Large Text" 
     android:layout_centerVertical="true"/> 

</RelativeLayout> 



Это явление почему-то происходит? Что я могу сделать, чтобы решить эту проблему?

+0

Вы также можете поделиться с ui xml? – ariefbayu

+0

@ariefbayu Спасибо. Я добавил :) – Stella

+0

Используйте общедоступные методы getViewTypeCount() и \t public int getItemViewType (int position). Я уверен, ваша проблема будет решена. – kgandroid

ответ

1

I soveld self, и это очень легко (поэтому я злюсь на меня ...) Я редактирую CustomAdapter.

До:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    int rowType = getItemViewType(position); 

    if(convertView == null){ 
     holder = new ViewHolder(); 

     switch (rowType){ 
      case TYPE_ITEM : 
       convertView = mInflater.inflate(R.layout.rio2016_venues_item, null); 
       holder.View = getItem(position).getView(mInflater, convertView); 
       break; 
      case TYPE_HEADER : 
       convertView = mInflater.inflate(R.layout.rio2016_venues_header, null); 
       holder.View = getItem(position).getView(mInflater, convertView); 
       break; 
     } 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    return convertView; 
} 

После:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    int rowType = getItemViewType(position); 

    if(convertView == null){ 
     holder = new ViewHolder(); 

     switch (rowType){ 
      case TYPE_ITEM : 
       convertView = mInflater.inflate(R.layout.rio2016_venues_item, null); 
       break; 
      case TYPE_HEADER : 
       convertView = mInflater.inflate(R.layout.rio2016_venues_header, null); 
       break; 
     } 

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

    holder.View = getItem(position).getView(mInflater, convertView); 

    return convertView; 
} 

Я только двигаться holder.View = getItem(position).getView(mInflater, convertView); к стороне из if(convertView == null) Фром внутри if(convertView == null).

Спасибо, что помогло :)!

2

Изменить код и попробуйте следующее:

public class VenuesListAdapter extends ArrayAdapter<Item>{ 

      private static final int TYPE_ITEM = 0; 
      private static final int TYPE_HEADER = 1; 

      private LayoutInflater mInflater; 

      public VenuesListAdapter(Context context, List<Item> items) { 
       super(context, 0, items); 
       mInflater = LayoutInflater.from(context); 
      } 

      public enum RowType { 
       LIST_ITEM, HEADER_ITEM 
      } 
     @Override 
      public int getViewTypeCount() { 
       // TODO Auto-generated method stub 
       return 2; 
      } 

     @Override 
      public int getItemViewType(int position) { 
       // TODO Auto-generated method stub 


       if(position == TYPE_ITEM) 
       {return 1;} 
       else{return 0;} 


      } 

      @Override 
      public int getViewTypeCount() { 
       return RowType.values().length; 
      } 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       ViewHolder holder = null; 


       if(convertView == null){ 
        holder = new ViewHolder(); 
        convertView.setTag(holder); 
       } else { 
        holder = (ViewHolder) convertView.getTag(); 
       } 

int type=getItemViewType(position); 
      if(type==1){ 
        convertView = mInflater.inflate(R.layout.rio2016_venues_item, null); 
     holder.View = getItem(position).getView(mInflater, convertView); 
      }else{ 
     convertView = mInflater.inflate(R.layout.rio2016_venues_header, null); 
     holder.View = getItem(position).getView(mInflater, convertView); 
    } 
       return convertView; 
      } 

      public static class ViewHolder { 
       public View View; 
      } 
     } 

Это общая проблема длинных ListView и могут быть решены с помощью:

@Override 
    public int getViewTypeCount() { 
     // TODO Auto-generated method stub 
     return integer(number of different cases in your list); 
    } 



    @Override 
    public int getItemViewType(int position) { 
     // TODO Auto-generated method stub 

    } 
+0

Что такое 'rowType' в' getItemViewType() '? – Stella

+0

см. Обновленный ответ. – kgandroid

+0

'int rowType = getItemViewType (position);' будет попадать в бесконечный цикл. T-T – Stella

1

В вашем getView(), кажется, вы кешируете объект View, который не работает надежно. Стиль моего кода отличается от вашего, так как мне нравится использовать мой custom adapter для управления всеми данными в ListView. Однако, как мне кажется, ваш стиль кода может работать, если вы вызываете метод setText для заполнения вашего ListView.

Пожалуйста, ознакомьтесь с образцом кода @Using an ArrayAdapter with ListView.

Примечания:

  1. Поиск текста для usersAdapter расширяет ArrayAdapter. В getView(), код User user = getItem(position) получает объект.В вашем случае объект имеет тип Позиция.
  2. tvName.setText(user.name). В вашем случае, возможно, setText(getItem(position).getText().

Надеюсь, что это несколько ясно.

Смежные вопросы