簡體   English   中英

具有回收站列表視圖的可擴展列表視圖作為子項

[英]Expandable List view with recycler list view as child

如圖所示,我能夠渲染視圖。 但是,可擴展視圖的onChildClick事件未被觸發。

此外,適配器中的觸摸事件沒有響應。 我的布局細節如下所述。

完整的源代碼可以在這里找到。

main_activity.xml

<ExpandableListView
    android:id="@+id/list_brands"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@null"
    android:groupIndicator="@null"
    android:dividerHeight="5dp" />

item_parent.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical">

    <TextView
        android:id="@+id/text_brand"
        android:textSize="18dp"
        android:text="Text"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/image_indicator"
        android:src="@drawable/ic_keyboard_arrow_down_black_18dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

item_group_child.xml

<android.support.v7.widget.RecyclerViewxmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mobiles"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

item_child.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp">

        <ImageView
            android:id="@+id/image_mobile"
            android:layout_width="70dp"
            android:adjustViewBounds="true"
            android:layout_height="120dp" />


        <TextView
            android:id="@+id/text_mobile_model"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center" />

        <TextView
            android:id="@+id/text_mobile_price"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center" />

</LinearLayout>

**我的解決方案:**觸摸事件直接傳遞到Recycler List視圖中的View holder的UI Elements。 但是為了給整個布局提供觸摸事件,我在child_item布局的頂部添加了透明按鈕,並添加了一個點擊監聽器。 以下是更新的child_item.xml

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_width="match_parent" >

        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/dummy_click"
            android:background="@android:color/transparent"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:padding="10dp"

            android:background="@color/colorGrey"
            >
        <ImageView
            android:id="@+id/img_subcategory"
            android:layout_gravity="center"
            android:src="@mipmap/ic_launcher"
            android:layout_marginTop="10dp"
            android:layout_width="180dp"
            android:layout_height="90dp"

            android:scaleType="fitXY"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Sub Category"
            android:textColor="@color/colorWhite"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="5dp"
            android:gravity="center"
            android:id="@+id/txt_subcategory"
            android:textSize="@dimen/app_text_title"/>

        </LinearLayout>
        </FrameLayout>
    </LinearLayout>

帶有回收列表視圖的可擴展列表視圖作為子項

理論

ExpandableListView子點擊示例:

點擊孩子,你可以這樣處理。

 getExpandableListView().setOnChildClickListener(new OnChildClickListener() { public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { // your code... } }); 

可擴展的RecyclerView ,有用的和簡單的項目點擊支持

Hugo的這篇博客文章展示了一種沒有聽眾的替代方式: http//www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/

它歸結為添加這些行:

 ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { @Override public void onItemClicked(RecyclerView recyclerView, int position, View v) { // do it } }); 

使用此課程時:

 public class ItemClickSupport {...} 

而且這個值在ids.xml中:

 <?xml version="1.0" encoding="utf-8"?> <resources> <item name="item_click_support" type="id" /> </resources> 

為什么RecyclerView沒有onItemClickListener()? RecyclerView與Listview有何不同?

自從引入ListView以來,onItemClickListener一直存在問題。 當你有任何內部元素的點擊監聽器時,不會觸發回調,但是沒有通知或記錄良好(如果有的話),所以存在很多混淆和SO問題。

OnItemClickListener不適用於包含按鈕的ListView項

只需將此行添加到項目視圖中,而不是listView本身

android:focusable="false"

從以下位置查看更多詳細信息: Android自定義ListView無法單擊項目


實踐

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

    ChildHolder childHolder = null;
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.item_group_child, parent, false);
        childHolder = new ChildHolder();

        // Fix listview onclicklistener issue: inner views can not be focusable
        childHolder.YOUR_INNER_BUTTON = (YOUR_BUTTON_TYPE) convertView.findViewById(R.id.YOUR_BUTTON_ID);
        childHolder.YOUR_INNER_BUTTON.setFocusable(false);

        convertView.setTag(childHolder);
    }
    else {
        childHolder = (ChildHolder) convertView.getTag();
    }

    childHolder.horizontalListView = (RecyclerView) convertView.findViewById(R.id.mobiles);
    LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
    childHolder.horizontalListView.setLayoutManager(layoutManager);

    MobileAdapter horizontalListAdapter = new MobileAdapter(context, brands.get(groupPosition).mobiles);
    childHolder.horizontalListView.setAdapter(horizontalListAdapter);

    return convertView;
}

根據我的遺留代碼為您的代碼添加了兩行:

    // Creates a ViewHolder and store references to the children views (collapsed)
    holder = new ViewHolderChildren();
    holder.textLine = (TextView) convertView.findViewById(R.id.usersTextLine);
    holder.subtextLine = (TextView) convertView.findViewById(R.id.usersSubtextLine);
    holder.iconLine = (ImageView) convertView.findViewById(R.id.usersIconLine);
    holder.buttonLine = (ImageButton) convertView.findViewById(R.id.usersButtonLine);
    holder.infoLine = (TextView) convertView.findViewById(R.id.usersInfoLine);
    holder.infoLine.setVisibility(TextView.GONE);
    holder.userprofileButton = (ImageButton) convertView.findViewById(R.id.usersUserprofileBtn);

    holder.buttonLine.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // if gone, set visible and arrow up image
            if (holder.infoLine.getVisibility() == TextView.GONE) {
                holder.infoLine.setVisibility(TextView.VISIBLE);
                holder.buttonLine.setImageLevel(1);
            }
            // if visible, set gone and arrow down image
            else {
                holder.infoLine.setVisibility(TextView.GONE);
                holder.buttonLine.setImageLevel(0);
            }
        }
    });
    //fixed listview onclicklistener bug: inner views can not be focusable
    holder.buttonLine.setFocusable(false);

    convertView.setTag(holder);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM