14

SpotifyのようにExpandableListViewを作成しようとしています...しかし、LinearLayoutを無効にしてボタンのように機能させる方法がわかりません(リストを展開します)私は好きなものを説明する画像を作成しました。テキスト/画像(親)のクリックを通常の操作として処理できるようにしたいです。右ボタンをクリックすると、Spotifyのようにリストが展開されます...

最初の図は拡張アクション(現在)を示し、2番目の図は拡張アクションがどうあるべきかを示しています...

4

3 に答える 3

20

これは少し古い質問ですが、この答えは誰かを助けるかもしれません。

Button特定またはその他をクリックしてグループを展開/折りたたみたい場合は、AdapterクラスのメソッドでViewそのButtonを取得する必要があります。getGroupView次に、onClickあなたのメソッドで、アダプタを作成するときに、ButtonにキャストparentするかExpandableListView、コンストラクタでリストの参照を渡す必要があります。

私は最初のアプローチを好みます。これがコードで、1つとそれが矢印であるTextViewと仮定しています。ImageView矢印の状態の変更も追加しました。

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

    String headerTitle = (String) getGroup(groupPosition);

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.left_drawer_list_group, parent, false);
    }

    TextView listHeaderText = (TextView) convertView
            .findViewById(R.id.left_menu_list_header_text);
    ImageView listHeaderArrow = (ImageView) convertView.findViewById(R.id.left_menu_list_header_arrow);

    listHeaderText.setText(headerTitle);

    //Set the arrow programatically, so we can control it
    int imageResourceId = isExpanded ? android.R.drawable.arrow_up_float : android.R.drawable.arrow_down_float;
    listHeaderArrow.setImageResource(imageResourceId);

    listHeaderArrow.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            if(isExpanded) ((ExpandableListView) parent).collapseGroup(groupPosition);
            else ((ExpandableListView) parent).expandGroup(groupPosition, true);

        }
    });

    return convertView;
}

さらに、onGroupClickリスナーの展開/折りたたみを無効にします。

@Override
public boolean onGroupClick(ExpandableListView parent, View v,
        int groupPosition, long id) {

    //Do some other stuff, but you shall not expand or collapse

    return true;
}

別の方法がありますが、かなり悪い方法です。それは、作成して設定Adapterしたクラス内にクラス全体をコピーすることです。しかし、そうしないでください。真剣に!;)ExpandableListViewAdapter

于 2014-07-18T15:09:35.063 に答える
3

これは、ListFragmentを拡張するChannelListからのonCreateです。フラグメントが呼び出されると、データが保存され、新しいアダプタが生成されます。

@Override   
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{                               
    m_ListView = new ExpandableListView(getActivity());
    m_ListView.setId(android.R.id.list);

    m_ListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    m_ListView.setMultiChoiceModeListener(m_MultiChoiceModeListener);

    m_ChannelListAdapter = new ChannelListAdapter(getActivity(), this);
    m_ListView.setAdapter(m_ChannelListAdapter);
    m_ListView.setGroupIndicator(null);
    m_ListView.setOnGroupClickListener(this);

    return m_ListView;
}

アダプタには、次のようなgetGroupViewメソッドがあります。

public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {

    if (view == null) 
    {
        view = inflater.inflate(R.layout.layout_channelwithimage, viewGroup, false);
    }

    TextView textView = (TextView) view.findViewById(R.id.labelwithimage);
    textView.setText(getGroup(i).toString());

    ImageButton imbu = (ImageButton) view.findViewById(R.id.imageButton);
    //imbu.setOnClickListener(this);    
    imbu.setFocusable(false);

    return view;
}

したがって、アダプタにImageButtonを登録すると、アダプタからonClickが呼び出されます。しかし、onClickでは、どのグループがクリックされたかわかりません...リスナーにボタンを登録しないと、ChannelListからonGroupClickが呼び出されません...

于 2013-01-30T14:19:37.287 に答える
0

過度にエレガントな解決策ではありませんが、それは私を助けました:

元のgroupIndicatorを保持しました。そのままの振る舞いが気に入りました。

groupItemレイアウトでは、元のgroupIndicatorが引き続きクリックできるように、空のビューでスペースをブロックしただけです。

<LinearLayout> 
....

<!--just dummy space underneath the default expand_collapse group icon - this way original expand collapse behavior is preserved on the icon-->
<View
        android:layout_width="25dp"
        android:layout_height="match_parent">
</View>

<!-- text view will have actionListener -->
<TextView
        android:id="@+id/category_name"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        .... /> 
.... 
</LinearLayout>

ExpandableListAdapterの作成中にcallBackオブジェクトに忍び込み、それをフックするよりも、「category_name」をクリックします(子要素とグループ要素の両方)

public class ExpandableListAdapter extends BaseExpandableListAdapter {
public interface OnCategoryActionListener {
    boolean onCategorySelected(long categoryId);
}
....

public ExpandableListAdapter(Activity context, Category rootCategory,    
OnCategoryActionListener callBack) {
    this.context = context;
    this.rootCategory = rootCategory;     
    this.callBack = callBack;
}
....
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View 
convertView, ViewGroup parent) {
    String categoryName = (String) getGroup(groupPosition);
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater)   
          context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.category, null);
    }
    TextView item = (TextView) convertView.findViewById(R.id.category_name);
    item.setTypeface(null, Typeface.BOLD);
    item.setText(categoryName);
    item.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            callBack.onCategorySelected(getGroupId(groupPosition));
        }
    });
  .....

ここで行う必要があるのは、マスターフラグメントクラスでExpandableListAdapterを適切に初期化することだけです。

expListAdapter = new ExpandableListAdapter(getActivity(), this.rootCategory,     
    new OnCategoryActionListener());
expListView = (ExpandableListView) getActivity().findViewById(R.id.categories_list);
expListView.setAdapter(expListAdapter);
于 2014-01-06T00:26:58.467 に答える