2012-07-03 3 views
5

私はExpandableListViewをデータベースからのデータで作成しています。そのために私はCursorTreeAdapterを使用していて、データベースから取得するデータを含むCursorオブジェクトでデータを設定します。ExpandableListViewは、子がないグループのインジケータを示しています

私は、デフォルトでは、子供がいないグループは「」は「拡張不可」と考えていたと考えています。

ただし、それでも行に展開アイコンが表示されます。クリックすると、何も実行されません。私はこのアイコンを表示したくありません。

子アイコンを持つグループに、展開アイコンを表示したいだけですが、これは起こっていません。すべての行(子を持ち、子がない行)の展開アイコンが表示されます。


UPDATE

私は私のコードを勉強していると私はこの問題は、グループのためにgroupIndicatorを設定する際に基本的であることを見てきました。しかし、私はこのように、描画可能な状態と拡張性に基づいているセレクタを作成し、それを設定するようなアプローチの多くを試してみた:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_empty="true" 
      android:state_expanded="false" 
      android:drawable="@android:color/transparent"/> 
    <item android:drawable="@drawable/expander_ic_maximized" /> 
</selector> 

しかし、グループが折りたたまれたときには(理由は子供を持つものも含め、すべてのグループのために非表示になりますAndroidで認識された折り畳まれたグループを空にする)。

子どもがいるグループのインジケータのみを設定する方が良いでしょうか?


ここは私のコードです。

public class ContactsExpandableListAdapter extends CursorTreeAdapter 
{ 

    TextView mContactNameTextView, mContactNumberTextView; 
    Cursor mChildrenCursor = null; 

    public ContactsExpandableListAdapter(Cursor cursor, Context context) 
    { 
     super(cursor, context); 
    } 

    @Override 
    protected Cursor getChildrenCursor(Cursor cursor) 
    { 
     if(mContactId == -1) 
      mContactId = null; 

     return mController.getContactById(mContactId); 
    } 

    public int getChildrenCount(int groupPosition) 
    { 
     return mChildrenCursor.getCount(); 
    } 

    @Override 
    protected View newGroupView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup) 
    { 
     View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false); 

     mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); 

     if(cursor.getString(cursor.getColumnIndex("contact_name")) == null)     mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      else 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name"))); 
      view.setTag(cursor.getString(cursor.getColumnIndex("contact_id"))); 
      return view; 
     } 

     @Override 
     protected View newChildView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup) 
     { 
      View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false); 

      if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) 
      { 
       mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      } 
      else 
      { 
       mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number); 
       mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      } 

      view.setTag(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      return view; 
     } 

     @Override 
     protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean) 
     { 
      mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); 
      if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      else 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name"))); 

view.setTag(cursor.getString(cursor.getColumnIndex("contact_id"))); 
     } 

     @Override 
     protected void bindChildView(View view, Context context, Cursor cursor, boolean paramBoolean) 
     { 
      if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) 
      { 
       mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); 
       mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      } 
      else 
      { 
       mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number); 
       mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); 
      } 
     } 
    } 

答えて

7

はExpandableListViewにfolowingを追加します。

android:groupIndicator="@android:color/transparent" 

あなたのアダプタ内の各グループのアイテムビューが内部インジケータを必要以上に。たとえば、ImageViewを.xmlの右側に追加することができます。お使いのアダプタクラスの使用では

@Override 
protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean) 
    ... 

    if (getChildrenCount(groupPosition) > 0) { 
     viewHolder.indicator.setVisibility(View.VISIBLE); 
     viewHolder.indicator.setImageResource(
       isExpanded ? R.drawable.indicator_expanded : R.drawable.indicator); 
    } else { 
     viewHolder.indicator.setVisibility(View.GONE); 
    } 
} 
+1

voidメソッドでどのようにビューを返すのですか? hehehたぶん 'newGroupView()'メソッドで正しいはずですか?ところで、** viewHolder **と** indicator **は何ですか? – rogcg

+0

申し訳ありません。返品は間違っていた。カーソルアダプタ内でビューを返す必要はありません。D。 ViewHolder(リスト内で物事をスピードアップするパターン)について:http://www.youtube.com/watch?v=wDBM6wVEO70&feature=player_detailpage#t=511s –

+0

上記のリンクの上で彼はViewHolderについて話をしています。それから彼はhttp://www.youtube.com/watchでそれを説明しますか?v = wDBM6wVEO70&feature = player_detailpage#t = 511s –

0

子供がいないグループを退室させてみませんか?

子を持つグループのみを表示するようにクエリを変更します。あなたのXMLで

+0

しかし、私は、あまりにも子供を持っていない項目を表示したいのですが、のみ表示します連絡先番号、ただ1つの行が拡大表示されます。 – rogcg

2

は、アダプターに、あなたは次の操作を行い

public View getGroupView(int groupPosition, boolean isExpanded, View convertView,ViewGroup parent) 
{ 
    if (getChildrenCount(groupPosition) == 0) { 
      indicator.setVisibility(View.INVISIBLE); 
    } 
    else { 
      indicator.setVisibility(View.VISIBLE); 
      indicator.setImageResource(isExpanded ? R.drawable.group_expanded : R.drawable.group_closed); 
    } 
} 
+1

ここでの指標は何ですか? –

+0

インジケータはExpandableListViewの右側にあるアイコンで、V.Itsのように、リストビューの状態が拡大または縮小されているように見えます。 – kabir