4

Android で ExpandableListView を使用しています。

このビューを膨らませるダイアログがあります:

<ExpandableListView
    android:id="@+id/comments_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/editTextNewComment"
    android:layout_alignParentLeft="true" >
</ExpandableListView>

<EditText
    android:id="@+id/editTextNewComment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_toLeftOf="@+id/imageButtonPostNewComment"
    android:ems="10"
    android:singleLine="true" >

    <requestFocus />
</EditText>

getgroupview() メソッドの BaseExpandableListAdapter は次のようになります。

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
        ViewGroup parent) {

    View row = convertView;
    ViewHolder holder = null;

    Log.d("LIST", "getGroupView() groupPosition " + groupPosition + "  isExpanded " + isExpanded + " row " + row);

    if(row==null) {
        LayoutInflater infl = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = infl.inflate(R.layout.list_item_comment,parent,false);
        holder = new ViewHolder(row);
        holder.imbutton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Integer pos = (Integer) v.getTag();
                //Do something
            }
        });
        row.setTag(holder);
    }
    else {
        holder = (ViewHolder) row.getTag();
    }
    holder.imbutton.setTag(Integer.valueOf(groupPosition));
    holder.header.setText(""+ (groupPosition+1) + " - " + comments[groupPosition].getOwner());
            //.... etc - setting all the textviews accordingly

    return row;
}

私の問題に:

edittext に何かを書き込むと、getgroupview が常に呼び出されます。これは、編集テキストに 1 つの文字を追加しただけのログからの出力です。

03-15 14:07:51.072: D/LIST(4176): getGroupView() groupPosition 0  isExpanded false row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.080: D/LIST(4176): getGroupView() groupPosition 1  isExpanded true row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.088: D/LIST(4176): getChildView()
03-15 14:07:51.096: D/LIST(4176): getGroupView() groupPosition 0  isExpanded false row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.104: D/LIST(4176): getGroupView() groupPosition 1  isExpanded true row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.111: D/LIST(4176): getChildView()
03-15 14:07:51.119: D/LIST(4176): getGroupView() groupPosition 0  isExpanded false row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.119: D/LIST(4176): getGroupView() groupPosition 1  isExpanded true row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.127: D/LIST(4176): getChildView()
03-15 14:07:51.135: D/LIST(4176): getGroupView() groupPosition 0  isExpanded false row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.135: D/LIST(4176): getGroupView() groupPosition 1  isExpanded true row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.143: D/LIST(4176): getChildView()
03-15 14:07:51.151: D/LIST(4176): getGroupView() groupPosition 0  isExpanded false row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.151: D/LIST(4176): getGroupView() groupPosition 1  isExpanded true row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.158: D/LIST(4176): getChildView()
03-15 14:07:51.205: D/LIST(4176): getGroupView() groupPosition 0  isExpanded false row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.205: D/LIST(4176): getGroupView() groupPosition 1  isExpanded true row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.213: D/LIST(4176): getChildView()
03-15 14:07:51.213: D/LIST(4176): getGroupView() groupPosition 0  isExpanded false row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.213: D/LIST(4176): getGroupView() groupPosition 1  isExpanded true row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.221: D/LIST(4176): getChildView()
03-15 14:07:51.221: D/LIST(4176): getGroupView() groupPosition 0  isExpanded false row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.221: D/LIST(4176): getGroupView() groupPosition 1  isExpanded true row android.widget.RelativeLayout{41a17d98 V.E..... ......I. 0,0-0,0}
03-15 14:07:51.229: D/LIST(4176): getChildView()

getGroupView() と getChildView() は、入力された文字ごとに複数回呼び出されます。上記の例では、リストビューは明らかに 8 回再描画されます (この例では、リストに 2 つのグループ ビューと 1 つの子ビューがあります)。

私は何が欠けていますか?edittext に何かを入力するときに、リストビューを再描画する必要さえないはずです。また、再描画されている場合でも、異なる getview-methods への 8 つの呼び出しがあるのはなぜですか?

編集:グループビューを折りたたんだり展開したりしても、getgroupview および getchildview-methods への呼び出しがたくさんあることがわかりました。これが本来あるべき姿ですか?

EDIT2:通常のアクティビティで edittext を含むリストを使用していくつかのテストを行いましたが、リストはそれほど頻繁に再描画されないようです。したがって、問題は、これをダイアログで提示しているという事実にあるようです。なぜ再描画する必要があるのか​​ わかりません。

4

1 に答える 1

7

getViewメソッド(もtrue getGroupView)がいつ呼び出され、何回呼び出されるかはわかりません。

しかし、必要以上に呼び出せるようなものはあります。レイアウトで、ExpandableListView高さをwrap_contentに設定します。私はそれが良いことだとは思わない:

子を再描画して、コンテンツに合わせてサイズを確認する必要がありますが、スクロール可能なレイアウトなので、コンテンツをラップする必要はありません。

テキストビュー用のスペースを残すために0dip、代わりにに設定してみてください。layout_weight="1"

<ExpandableListView
    android:id="@+id/comments_list"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:layout_above="@+id/editTextNewComment"
    android:layout_alignParentLeft="true" >
</ExpandableListView>
于 2013-03-15T13:26:55.603 に答える