2010-12-07 2 views
0

У меня есть ExpandableListView с большим количеством детей. Некоторые из детей состоят из названия и описания, в то время как у некоторых нет описания. Я использую SimpleExpandableListAdapter, а макет для детей состоит из двух элементов TextView в LinearLayout.Как остановить пустые элементы TextView от занимать слишком много места в списке?

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

Есть ли способ скрыть второй TextView на лету в адаптере или настроить макет, чтобы пустой TextView не занимал места?

Спасибо.

ответ

4

Кристиан был правильным (и если бы он отправил его в качестве ответа, я бы просто принял его;)).

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

public class SpellListAdapter extends CursorAdapter { 
    private LayoutInflater mLayoutInflater; 
    private Context mContext; 
    public SpellListAdapter(Context context, Cursor c) { 
     super(context, c); 
     mContext = context; 
     mLayoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = mLayoutInflater.inflate(R.layout.list_item_fave, parent, false); 
     return v; 
    } 

    @Override 
    public void bindView(View v, Context context, Cursor c) { 
     String spell = c.getString(c.getColumnIndexOrThrow(SpellDbAdapter.KEY_SPELL)); 
     int fave = c.getInt(c.getColumnIndexOrThrow(SpellDbAdapter.KEY_FAVORITE)); 

     TextView Spell = (TextView) v.findViewById(R.id.text); 
     if (Spell != null) { 
      Spell.setText(spell); 
     } 

     //Set Fave Icon 
     TextView Fave = (TextView) v.findViewById(R.id.fave_icon); 
     //here's an important bit. Even though the element is set to invisible by 
     //default in xml, we still have to set it every time. Then, if the 
     //spell is marked as a favorite, set the view to visible. 
     Fave.setVisibility(View.INVISIBLE); 
     if (fave == 1){ 
      Fave.setVisibility(View.VISIBLE); 
     } 
    } 

} 
1

Попробуйте установить видимость View.GONE

+0

Это скрывает все описания. Есть ли способ установить его на лету в адаптере? – anakin78z 2010-12-07 01:10:55

+1

+1 @anakin создать свой собственный адаптер. – Cristian 2010-12-07 01:20:48

0

Кажется, что также установлено Fave.setHeight (0) будет делать трюк в адаптере.