3

複数のグループを持つ ExpandableList があり、各グループには異なるタイプ (異なるレイアウト) の子が含まれています。構造は似ているが子ビューが異なるアクティビティがいくつかあるため、カスタム アダプタを作成することにしました。アダプターは、いくつかの問題を除いて、ほとんどの場合うまく機能します。

  1. 子ビューにテキストを入力することはほぼ不可能です。各文字が入力されると、EditText がフォーカスを失ったように見えます。動作を説明するためにスクリーンショットを添付しました。
  2. グループを展開/折りたたむと、数回後に TextViews のテキストが消え、各ビューの最初の単語の最初の文字だけが表示されます。どういうわけか、レイアウト パラメータが何らかの形で誤って計算されているように見えます。

スクリーンショットは次のとおりです。 EditText - ぎこちないタイピング TextView - TextView 内のテキストのレイアウト

そして、これが私のアダプターのコードです:

public class GenericExpandableListAdapter extends BaseExpandableListAdapter {

    private Context context;
    private String[] groups;
    private View[] children;

    public static interface ExpandableListItemClickListener {
        public void onClick(View view, int groupId, int itemId);
    }

    public GenericExpandableListAdapter(Context context, String[] groups, int[] children) {
        if(groups.length != children.length) {
            throw new IllegalArgumentException("Items must have the same length as groups.");
        }
        this.context = context;
        this.groups = groups;

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.children = new View[children.length];
        for(int i = 0; i < children.length; i++) {
            this.children[i] = inflater.inflate(children[i], null);
        }
    }

    public GenericExpandableListAdapter(Context context, String[] groups, View[] children) {
        if(groups.length != children.length) {
            throw new IllegalArgumentException("Items must have the same length as groups.");
        }
        this.context = context;
        this.groups = groups;
        this.children = children;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return children[groupPosition];
    }

    @Override
    public int getChildTypeCount() {
        return children.length + 1;
    }

    @Override
    public int getChildType(int groupPosition, int childPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        if(convertView != null) {
            return convertView;
        }
        return children[groupPosition];
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return 1;
    }

    @Override
    public Object getGroup(int groupPosition) {
        return groups[groupPosition];
    }

    @Override
    public int getGroupTypeCount() {
        return 1;
    }

    @Override
    public int getGroupCount() {
        return groups.length;
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public int getGroupType(int groupPosition) {
        return 0;
    }

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

        if(convertView != null) {
            ((TextView) convertView).setText(getGroup(groupPosition).toString());
            return convertView;
        }
        // Layout parameters for the ExpandableListView
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, 64);

        final TextView textView = new TextView(context);
        textView.setLayoutParams(lp);
        // Center the text vertically
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        // Set the text starting position
        textView.setPadding(50, 0, 0, 0);
        textView.setText(getGroup(groupPosition).toString());
        return textView;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }

}
4

1 に答える 1

5

同様の問題がありました。

これをマニフェスト ファイルに追加して、動作するかどうかを確認します。それは私のためにしました。

android:windowSoftInputMode="adjustPan" 

アクティビティタグ内にあるので、次のようになります

<activity
        android:name=".MainActivity"
        android:label="@string/app_name" 
        android:windowSoftInputMode="adjustPan">
于 2012-07-26T17:50:11.653 に答える