4

次のコンストラクターで ResourceCursorTreeAdapter を使用するにはどうすればよいですか?

ResourceCursorTreeAdapter(Context context, Cursor cursor, int collapsedGroupLayout, int expandedGroupLayout, int childLayout)

私はそれを次のように使用しようとしています:

_resultsCursorTreeAdapter = new ResourceCursorTreeAdapter(_resultsList.getContext(), _dbAdapter.getAllGroups(), 
        R.layout.timing_group_view_collapsed, R.layout.timing_group_view_expanded, R.layout.timing_result_view) {

 @Override
 protected Cursor getChildrenCursor(Cursor groupCursor) {
  // Given the group, we return a cursor for all the children within that group 
  int groupId = groupCursor.getInt(0);
  Cursor childCursor = _dbAdapter.getContractionsForGroup(groupId);
  return childCursor;
 }

 @Override
 protected void bindGroupView(View groupView, Context context, Cursor cursor,
     boolean isExpanded) {

  TimingGroupView timingGroupItem =  null;
  if(groupView instanceof LinearLayout){
   Log.i("TimingGroupView", "Has Header");
   LinearLayout layout = (LinearLayout)groupView;

   timingGroupItem = (TimingGroupView) layout.getChildAt(0);
  } else{
   Log.i("TimingGroupView", "No Header");
   timingGroupItem = (TimingGroupView) groupView;
  } 
 ...

グループ ノードが展開されている場合、各行が子ノードに保持されているテーブルのヘッダーをグループ ノードに含める必要があります。この質問の下部に、timing_group_view_expanded.xml と timing_group_view_collapsed.xml が表示されます。何らかの理由で、グループ ノードが展開されているか折りたたまれているかにかかわらず、group_view_expanded は使用されません。私はこれを間違って使用していますか?このコンストラクターで ResourceCursorTreeAdapter を動作させることができた人はいますか?

timing_group_view_expanded.xml は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/timing_group_view"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"
 android:background="@color/header_timing_color">

 <com.contractiontracker.TimingGroupView
  android:id="@+id/timing_group_item" xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="wrap_content"
  android:layout_marginLeft="30px" android:padding="10dp"
  android:scrollbars="vertical" 
  android:fadingEdge="vertical" 
  android:background="@color/header_timing_color"
  android:textColor="@color/text_color"/>

 <com.contractiontracker.RowLayout android:id="@+id/timing_group_view"
  android:orientation="horizontal" android:layout_width="fill_parent"
  android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"
  android:background="@color/header_color" android:textColor="@color/text_color">

  <TextView android:id="@+id/interval_header"
   android:layout_width="fill_parent" android:layout_height="wrap_content"
   android:text="Interval" android:layout_weight="1"
   android:layout_gravity="left|bottom" android:gravity="center" 
   android:textColor="@color/text_color">
  </TextView>
  <TextView android:id="@+id/duration_header"
   android:layout_width="fill_parent" android:layout_height="wrap_content"
   android:text="Duration" android:layout_weight="1"
   android:layout_gravity="center_horizontal|bottom" android:gravity="center"
   android:textColor="@color/text_color"
   >
  </TextView>
  <TextView android:id="@+id/intensity_header"
   android:layout_width="fill_parent" android:layout_height="wrap_content"
   android:text="Intensity" android:layout_weight="1"
   android:layout_gravity="right|bottom" android:gravity="center"
   android:textColor="@color/text_color"
   >
  </TextView>
</com.contractiontracker.RowLayout>
</LinearLayout>

timing_group_view_collapsed.xml は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<com.contractiontracker.TimingGroupView 
  android:id="@+id/timing_group_item"
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:layout_marginLeft="50px" 
 android:padding="10dp"
 android:scrollbars="vertical"
 android:textColor="@color/text_color"
 android:fadingEdge="vertical"/>
4

3 に答える 3

7

問題は、ビューの作成時にResourceCursorTreeAdapter のみ正しいレイアウトを作成することです。したがって、グループが折りたたまれたり展開されたりした場合、newGroupView()再度呼び出されないため、コンストラクターに渡された異なるグループレイアウトは期待どおりに使用されません。

通常の子と最後の子に異なるレイアウトを使用する場合、子レイアウトにも同じ問題が存在します。データを変更することなく、そこで発生します。グループを再拡張した後、最初のグループはフッターレイアウトになり、その逆も同様でした。完全にランダムで、リスト内の位置に基づくものではありません。

Aleksander Oが彼の例で示したように、常にメソッドを呼び出すことでこれを修正できます(newGroupView()異なるレイアウトが使用されている場合はそれぞれ)。getGroupViewgetChildView

常に新しいビューを作成することを避けるために、私は自分のケースで機能する別のアプローチを試しました。

  • グループ/子ビューに使用されるレイアウトのルート要素に異なるIDを追加します
  • これらのview-idをアダプタのintメンバーとして保存します。

    // Get the view ids for comparison
    View view = newGroupView(mContext, null, false, null);
    mCollapsedGroupLayoutViewId = view.getId();
    view = newGroupView(mContext, null, true, null);
    mExpandedGroupLayoutViewId = view.getId();
    
    view = newChildView(mContext, null, false, null);
    mChildLayoutViewId = view.getId();
    view = newChildView(mContext, null, true, null);
    mLastChildLayoutViewId = view.getId();
    
  • getGroupViewの実装(およびgetChildViewとのアナログ):

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            Cursor cursor = getGroup(groupPosition);
            if (cursor == null) {
                throw new IllegalStateException("this should only be called when the cursor is valid");
            }
    
            View v;
            if (convertView == null 
              || (isExpanded && convertView.getId() == mCollapsedGroupLayoutViewId) 
              || (!isExpanded && convertView.getId() == mExpandedGroupLayoutViewId)) {
                v = newGroupView(mContext, cursor, isExpanded, parent);
            }
            else {
                v = convertView;
            }
            bindGroupView(v, mContext, cursor, isExpanded);
            return v;
    }
    
于 2010-09-09T15:16:39.023 に答える
1

適切なリサイクルによる簡単なソリューション。

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    Cursor cursor = getGroup(groupPosition);
    if (cursor == null) {
        throw new IllegalStateException("this should only be called when the cursor is valid");
    }

    View view;
    if (convertView == null || convertView.getTag() != isExpanded) {
        view = newGroupView(mActivity, cursor, isExpanded, parent);
        view.setTag(isExpanded);
    } else {
        view = convertView;
    }
    bindGroupView(view, mActivity, cursor, isExpanded);
    return view;
}
于 2014-09-14T07:45:47.777 に答える
1

SimpleExpandableListAdapter の一時的な解決策は次のとおりです。

public class LocalAdapter extends SimpleExpandableListAdapter {
    private List<? extends Map<String, ?>> mGroupData;
    private String[] mGroupFrom;
    private int[] mGroupTo;

    private List<? extends List<? extends Map<String, ?>>> mChildData;

    private LayoutInflater mInflater;

    public LocalAdapter(Context context,
            List<? extends Map<String, ?>> groupData, int groupLayout,
            String[] groupFrom, int[] groupTo,
            List<? extends List<? extends Map<String, ?>>> childData,
            int childLayout, String[] childFrom, int[] childTo) {
        this(context, groupData, groupLayout, groupLayout, groupFrom, groupTo, childData,
                childLayout, childLayout, childFrom, childTo);
    }

    public LocalAdapter(Context context,
            List<? extends Map<String, ?>> groupData, int expandedGroupLayout,
            int collapsedGroupLayout, String[] groupFrom, int[] groupTo,
            List<? extends List<? extends Map<String, ?>>> childData,
            int childLayout, String[] childFrom, int[] childTo) {
        this(context, groupData, expandedGroupLayout, collapsedGroupLayout,
                groupFrom, groupTo, childData, childLayout, childLayout,
                childFrom, childTo);
    }

    public LocalAdapter(Context context,
            List<? extends Map<String, ?>> groupData, int expandedGroupLayout,
            int collapsedGroupLayout, String[] groupFrom, int[] groupTo,
            List<? extends List<? extends Map<String, ?>>> childData,
            int childLayout, int lastChildLayout, String[] childFrom,
            int[] childTo) {

        super(context, groupData, expandedGroupLayout,
                collapsedGroupLayout, groupFrom, groupTo, childData,
                childLayout, lastChildLayout, childFrom, childTo);

        mGroupData = groupData;
        mGroupFrom = groupFrom;
        mGroupTo = groupTo;
        mChildData = childData;
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }        

    private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {
        int len = to.length;

        for (int i = 0; i < len; i++) {
            TextView v = (TextView)view.findViewById(to[i]);
            if (v != null) {
                v.setText((String)data.get(from[i]));
            }
        }
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
            ViewGroup parent) {
        View v = newGroupView(isExpanded, parent);
        bindView(v, mGroupData.get(groupPosition), mGroupFrom, mGroupTo);
        return v;
    }
}
于 2010-07-09T08:22:18.663 に答える