【问题标题】:ExpandableListView's items get blendedExpandableListView 的项目得到混合
【发布时间】:2016-10-26 06:54:54
【问题描述】:

所以我制作了这个用于梦境分析的应用程序,它在手机上运行良好,但在平板电脑上,explists 中的信息混合在一起,如下图所示。

也就是说,当您单击该组时,它应该隐藏/显示其子项,但正如您所见,在平板电脑上它只是继续一个接一个地绘制信息,就像显示不会刷新其内容一样,我有不知道该怎么办,所以请你帮忙。

容器布局:

<?xml version="1.0" encoding="utf-8"?>

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


    <ExpandableListView
        android:id="@+id/sExpList"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:groupIndicator="@null" />

    <!-- FOR PORTRAIT LAYOUTS !-->
    <FrameLayout
        android:id="@+id/adLayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:layout_marginTop="5dp"
        android:baselineAligned="false"
        android:orientation="vertical"/>
</LinearLayout>

组元代码:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    >

    <TextView
        android:id="@+id/textGroup"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="20dp"
        android:layout_weight="1"
        android:textStyle="bold"
        android:textSize="@dimen/text_normal_size" />

    <ImageButton

        android:id="@+id/sExp_BtnAdd"
        android:layout_width="@dimen/btns_heigh"
        android:layout_height="@dimen/btns_heigh"
        android:layout_gravity="center_vertical"
        android:contentDescription=""
        android:focusable="false"
        android:scaleType="centerCrop"
        android:src="?attr/img_add" />

</LinearLayout>

子元素代码:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="match_parent">

    <TextView
            android:id="@+id/textChild"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="20dp"
            android:textColor="@android:color/white"
            android:layout_weight="1"
        android:textSize="@dimen/text_normal_size" />

    <ImageButton
            android:layout_width="@dimen/btns_heigh"
            android:layout_height="@dimen/btns_heigh"
            android:id="@+id/sExp_BtnEdit"
            android:layout_gravity="center_vertical"
            android:src="?attr/img_edit"
            android:scaleType="centerCrop"
            android:focusable="false"
        android:layout_marginRight="@dimen/btns_heigh" />


</LinearLayout>

活动代码:

import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

/**
 * Created with IntelliJ IDEA.
 * User: Movsar Bekaev
 * Date: 11.06.13
 * Time: 7:30
 * To change this template use File | Settings | File Templates.
 */
public class ActSignsManager extends cbActivity {


    ExpandableListView expListView;

    int selected_type;
    String[] cats;
    ArrayList<xSign> MySigns;
    _sManagerExpAdapter adapter;


    String[] catsMind;
    String[] catsAction;
    String[] catsForm;
    String[] catsCircumstances;


    private void cInitialization() {
        setContentView(R.layout.alay_signs_manager);

        catsMind = getResources().getStringArray(R.array.smanager_cats_mind);
        catsAction = getResources().getStringArray(R.array.smanager_cats_action);
        catsForm = getResources().getStringArray(R.array.smanager_cats_form);
        catsCircumstances = getResources().getStringArray(R.array.smanager_cats_circumstances);

        expListView = (ExpandableListView) findViewById(R.id.sExpList);

        newSignFunc();
        readSigns();
        expFiller();
        adapter.notifyDataSetChanged();


        expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            public boolean onChildClick(ExpandableListView parent, View v,
                                        int groupPosition, int childPosition, long id) {
                String s = MySigns.get(SignIndexAt(selected_type, groupPosition, adapter.getChild(groupPosition, childPosition).toString())).getTitle();
                Toast.makeText(ActSignsManager.this, String.valueOf(s), Toast.LENGTH_LONG).show();
                return false;
            }
        });
        expListView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {

            @Override
            public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
                String menuItems[];
                ExpandableListView.ExpandableListContextMenuInfo info =
                        (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
                int type = ExpandableListView.getPackedPositionType(info.packedPosition);
                int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
                int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);

                if (type == 0) {

                    menuItems = getResources().getStringArray(R.array.exp_menu_ongroup);
                    menu.setHeaderTitle(adapter.getGroupText(groupPos));
                    for (int i = 0; i < menuItems.length; i++) {
                        menu.add(Menu.NONE, i, i, menuItems[i]);
                    }
                }
                if (type == 1) {
                    String s = adapter.getChild(groupPos, childPos).toString();
                    menuItems = getResources().getStringArray(R.array.exp_menu_onchild);
                    menu.setHeaderTitle(s);
                    for (int i = 0; i < menuItems.length; i++) {
                        menu.add(Menu.NONE, i, i, menuItems[i]);
                    }
                }
            }
        });

    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.DarkTheme);
        cInitialization();

    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();
        int menuItemIndex = item.getItemId();
        int type = ExpandableListView.getPackedPositionType(info.packedPosition);
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
        int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);

        if (type == 0) {

            switch (menuItemIndex) {
                case 0:
                    Intent i = new Intent(ActSignsManager.this, ActSignsAddNew.class);
                    ps_int_params.put("Type", selected_type);
                    ps_string_arr_params.put("Categories", cats);
                    ps_int_params.put("Selected_Item", groupPos);

                    if (IS_FREE_VERSION && MySigns.size() > 69)
                        Toast.makeText(ActSignsManager.this, getString(R.string.ruefully_you_cant_add_another_sign), Toast.LENGTH_LONG).show();
                    else startActivity(i);

                    break;
            }
        }
        if (type == 1) {
            int index = SignIndexAt(selected_type, groupPos, adapter.getChild(groupPos, childPos).toString());

            switch (menuItemIndex) {
                case 0:
                    //     Toast.makeText(sManager.this, "edit", 5000).show();
                    Intent i = new Intent(ActSignsManager.this, ActSignsAddNew.class);

                    ps_int_params.put("ID", MySigns.get(index).getID());
                    ps_string_params.put("Name", MySigns.get(index).getTitle());
                    ps_int_params.put("Type", MySigns.get(index).getType());
                    ps_int_params.put("Category", MySigns.get(index).getCategory());
                    ps_string_params.put("Note", MySigns.get(index).getNote());
                    ps_string_arr_params.put("Categories", cats);


                    startActivity(i);
                    break;
            }
        }

        return true;
    }

    // нажатие на элемент

    void newSignFunc() {
        String type = ps_string_params.get("Type");
        if (type.equals("Mind")) {
            cats = catsMind;
            selected_type = 0;
        }
        if (type.equals("Action")) {
            cats = catsAction;
            selected_type = 1;
        }
        if (type.equals("Form")) {
            cats = catsForm;
            selected_type = 2;
        }
        if (type.equals("Circumstances")) {
            cats = catsCircumstances;
            selected_type = 3;
        }

    }

    private void readSigns() {
        MySigns = new ArrayList<xSign>();

        Cursor c = ps_db.query(const_tbl_signs, null, null, null, null, null, null);
        if (c != null) {
            if (c.moveToFirst()) {
                do {
                    xSign iSingleSign = new xSign();
                    iSingleSign.setID(c.getInt(DBI_SIGNS_ID));
                    iSingleSign.setHash(c.getString(DBI_SIGNS_HASH));
                    iSingleSign.setTitle(c.getString(DBI_SIGNS_TITLE));
                    iSingleSign.setType(c.getInt(DBI_SIGNS_TYPE));
                    iSingleSign.setCategory(c.getInt(DBI_SIGNS_CATEGORY));
                    iSingleSign.setNote(c.getString(DBI_SIGNS_NOTE));
                    MySigns.add(iSingleSign);
                    Log.d("777", iSingleSign.getID() + "||| cat:" + iSingleSign.getCategory() + "||| type:" + iSingleSign.getType());
                } while (c.moveToNext());
                c.close();
            } else
                Log.d("777", "0 rows");
        }


    }


    private int SignIndexAt(int type, int category, String name) {
        boolean exist = false;
        int index = -1;
        for (int i = 0; i < this.MySigns.size(); i++) {
            if (this.MySigns.get(i).getTitle().equals(name) && this.MySigns.get(i).getCategory() == category && this.MySigns.get(i).getType() == type) {
                index = i;
                exist = true;
            }
        }
        if (exist) {
            return index;
        } else {
            return 999999;
        }
    }

    private boolean removeSign(int index) {
        ps_db.delete(const_tbl_signs, "id = " + MySigns.get(index).getID(), null);

        Toast.makeText(ActSignsManager.this, getString(R.string.messages_sign_removed), Toast.LENGTH_LONG).show();
        // Refresh main activity upon close of dialog box

        readSigns();
        expFiller();

        adapter.notifyDataSetChanged();
        return true;
    }

    private void expFiller() {
        ArrayList<String> tmp;
        ArrayList<ArrayList<String>> groups = new ArrayList<ArrayList<String>>();
        for (int i = 0; i < cats.length; i++) {
            tmp = new ArrayList<String>();
            for (xSign sign : MySigns) {
                if (sign.getCategory() == i && sign.getType() == selected_type)
                    tmp.add(sign.getTitle());
            }
            groups.add(tmp);
        }
        //Создаем адаптер и передаем context и список с данными
        adapter = new _sManagerExpAdapter(this, cats, groups);
        expListView.setAdapter(adapter);
    }

    @Override
    public void onResume() {
        super.onResume();
        cInitialization();
        showAds();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        cInitialization();
        showAds();
    }

    public class _sManagerExpAdapter extends BaseExpandableListAdapter {

        private ArrayList<ArrayList<String>> mGroups;
        private Context mContext;
        private String[] cats;

        public _sManagerExpAdapter(Context context, String[] categories, ArrayList<ArrayList<String>> groups) {
            mContext = context;
            mGroups = groups;
            cats = categories;
        }


        public String getGroupText(int groupPosition) {
            return cats[groupPosition];
        }

        @Override
        public int getGroupCount() {
            return mGroups.size();
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            return mGroups.get(groupPosition).size();
        }

        @Override
        public Object getGroup(int groupPosition) {
            return mGroups.get(groupPosition);
        }

        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return mGroups.get(groupPosition).get(childPosition);
        }

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

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

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

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                                 ViewGroup parent) {
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.s_exp_group_view, null);
            }

            if (isExpanded) {
                //Изменяем что-нибудь, если текущая Group раскрыта
            } else {
                //Изменяем что-нибудь, если текущая Group скрыта
            }

            TextView textGroup = (TextView) convertView.findViewById(R.id.textGroup);
            textGroup.setText(cats[groupPosition] + " [" + String.valueOf(this.getChildrenCount(groupPosition)) + "]");

            ImageView btnAddSigns = (ImageView) convertView.findViewById(R.id.sExp_BtnAdd);
            btnAddSigns.setFocusable(false);
            final int gPos = groupPosition;

            btnAddSigns.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent i = new Intent(ActSignsManager.this, ActSignsAddNew.class);
                    ps_int_params.put("Type", selected_type);
                    ps_string_arr_params.put("Categories", cats);
                    ps_int_params.put("Selected_Item", gPos);

                    if (IS_FREE_VERSION && MySigns.size() > 69)
                        Toast.makeText(ActSignsManager.this, getString(R.string.ruefully_you_cant_add_another_sign), Toast.LENGTH_LONG).show();
                    else startActivity(i);
                }
            });

            return convertView;

        }

        @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                                 View convertView, ViewGroup parent) {
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.s_exp_child_view, null);
            }

            TextView textChild = (TextView) convertView.findViewById(R.id.textChild);
            textChild.setText(mGroups.get(groupPosition).get(childPosition));

            final int index = SignIndexAt(selected_type, groupPosition, adapter.getChild(groupPosition, childPosition).toString());

            ImageView btnEditSign = (ImageView) convertView.findViewById(R.id.sExp_BtnEdit);
            btnEditSign.setFocusable(false);


            btnEditSign.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent i = new Intent(ActSignsManager.this, ActSignsAddNew.class);

                    ps_int_params.put("ID", MySigns.get(index).getID());
                    ps_string_params.put("Name", MySigns.get(index).getTitle());
                    ps_int_params.put("Type", MySigns.get(index).getType());
                    ps_int_params.put("Category", MySigns.get(index).getCategory());
                    ps_string_params.put("Note", MySigns.get(index).getNote());
                    ps_string_arr_params.put("Categories", cats);
                    startActivity(i);
                }
            });


            return convertView;
        }

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


}

【问题讨论】:

    标签: android expandablelistview


    【解决方案1】:

    我能够让它工作,但我得到的错误与你的略有不同。

    当我尝试使用您的布局(减去我没有的资源)时,group_element.xmlchild_element.xml 中的 ImageButtons 以某种方式捕获了整行中的 MotionEvents(当它们不应该),就我而言,它与布局的扩展有关。

    解决方案:我只是将两个ImageButton 用于两个ImageView,并为两个视图构建OnTouchListeners。如您所见,它在 Nexus 7 模拟器上运行。

    因为我没有你的数据集,最重要的是适配器代码我不能肯定这会解决你的问题。

    如果您有兴趣,我已经在 ExpandableListViews 上的 JournalDev 适配器示例的自定义版本上测试了您的 XML:

    import java.util.HashMap;
    import java.util.List;
    import android.content.Context;
    import android.graphics.Typeface;
    import android.view.LayoutInflater;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    public class CustomExpandableListAdapter extends BaseExpandableListAdapter {
    
        private Context context;
        private List<String> expandableListTitle;
        private HashMap<String, List<String>> expandableListDetail;
    
        public CustomExpandableListAdapter(Context context, List<String> expandableListTitle,
                                           HashMap<String, List<String>> expandableListDetail) {
            this.context = context;
            this.expandableListTitle = expandableListTitle;
            this.expandableListDetail = expandableListDetail;
        }
    
        @Override
        public Object getChild(int listPosition, int expandedListPosition) {
            return this.expandableListDetail.get(this.expandableListTitle.get(listPosition))
                    .get(expandedListPosition);
        }
    
        @Override
        public long getChildId(int listPosition, int expandedListPosition) {
            return expandedListPosition;
        }
    
        @Override
        public View getChildView(int listPosition, final int expandedListPosition,
                                 boolean isLastChild, View convertView, ViewGroup parent) {
            final String expandedListText = (String) getChild(listPosition, expandedListPosition);
            if (convertView == null) {
    
                //---------------------------------------------
                LayoutInflater layoutInflater = (LayoutInflater) this.context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
                convertView = layoutInflater.inflate(R.layout.child_element, null);
            }
            TextView expandedListTextView = (TextView) convertView
                    .findViewById(R.id.textChild);
            expandedListTextView.setText(expandedListText);
    
            ImageView editViewBtn = (ImageView)convertView.findViewById(R.id.sExp_BtnEdit);
            editViewBtn.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
    
                    // do stuff
    
                    return false;
                }
            });
    
    
            return convertView;
        }
    
        @Override
        public int getChildrenCount(int listPosition) {
            return this.expandableListDetail.get(this.expandableListTitle.get(listPosition))
                    .size();
        }
    
        @Override
        public Object getGroup(int listPosition) {
            return this.expandableListTitle.get(listPosition);
        }
    
        @Override
        public int getGroupCount() {
            return this.expandableListTitle.size();
        }
    
        @Override
        public long getGroupId(int listPosition) {
            return listPosition;
        }
    
        @Override
        public View getGroupView(int listPosition, boolean isExpanded,
                                 View convertView, ViewGroup parent) {
            String listTitle = (String) getGroup(listPosition);
            if (convertView == null) {
                LayoutInflater layoutInflater = (LayoutInflater) this.context.
                        getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
                convertView = layoutInflater.inflate(R.layout.group_element, null);
            }
            TextView listTitleTextView = (TextView) convertView
                    .findViewById(R.id.textGroup);
            listTitleTextView.setTypeface(null, Typeface.BOLD);
            listTitleTextView.setText(listTitle);
            ImageView addV = (ImageView)convertView.findViewById(R.id.sExp_BtnAdd);
            addV.setVisibility(View.VISIBLE);
    
            addV.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
    
                    // do stuff
    
                    return false;
                }
            });
    
            return convertView;
        }
    
        @Override
        public boolean hasStableIds() {
            return false;
        }
    
        @Override
        public boolean isChildSelectable(int listPosition, int expandedListPosition) {
            return true;
        }
    }
    

    虚拟数据生成器:

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    public class ExpandableListDataPump {
        public static HashMap<String, List<String>> getData() {
            HashMap<String, List<String>> expandableListDetail = new HashMap<String, List<String>>();
    
            List<String> ego = new ArrayList<String>();
            ego.add("dream 1");
            ego.add("dream 2");
            ego.add("dream 3");
            ego.add("dream 4");
            ego.add("dream 5");
    
            List<String> personalities = new ArrayList<String>();
            personalities.add("dream 1");
            personalities.add("dream 2");
            personalities.add("dream 3");
            personalities.add("dream 4");
    
            List<String> places = new ArrayList<String>();
            places.add("dream 1");
            places.add("dream 2");
            places.add("dream 3");
            places.add("dream 4");
            places.add("dream 5");
    
            expandableListDetail.put("Form of the ego", ego);
            expandableListDetail.put("Form of other personalities", personalities);
            expandableListDetail.put("Place's form", places);
            return expandableListDetail;
        }
    }
    

    主要活动:

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ExpandableListAdapter;
    import android.widget.ExpandableListView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    public class Main4Activity extends AppCompatActivity {
    
    
        ExpandableListView expandableListView;
        ExpandableListAdapter expandableListAdapter;
        List<String> expandableListTitle;
        HashMap<String, List<String>> expandableListDetail;
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            expandableListView = (ExpandableListView) findViewById(R.id.sExpList);
            expandableListDetail = ExpandableListDataPump.getData();
            expandableListTitle = new ArrayList<>(expandableListDetail.keySet());
            expandableListAdapter = new CustomExpandableListAdapter(this, expandableListTitle, expandableListDetail);
            expandableListView.setAdapter(expandableListAdapter);
            expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
    
                @Override
                public void onGroupExpand(int groupPosition) {
                    Toast.makeText(getApplicationContext(),
                            expandableListTitle.get(groupPosition) + " List Expanded.",
                            Toast.LENGTH_SHORT).show();
                }
            });
    
            expandableListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
    
                @Override
                public void onGroupCollapse(int groupPosition) {
                    Toast.makeText(getApplicationContext(),
                            expandableListTitle.get(groupPosition) + " List Collapsed.",
                            Toast.LENGTH_SHORT).show();
    
                }
            });
    
            expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
                @Override
                public boolean onChildClick(ExpandableListView parent, View v,
                                            int groupPosition, int childPosition, long id) {
                    Toast.makeText(
                            getApplicationContext(),
                            expandableListTitle.get(groupPosition)
                                    + " -> "
                                    + expandableListDetail.get(
                                    expandableListTitle.get(groupPosition)).get(
                                    childPosition), Toast.LENGTH_SHORT
                    ).show();
                    return false;
                }
            });
        }
    }
    

    您的主 xml 略有更改,不要忘记从 ImageButton 切换到 ImageView: (我改了一些你没有分享的资源和维度)

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="10dp">
    
    
        <ExpandableListView
            android:id="@+id/sExpList"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:groupIndicator="@null" />
    
        <!-- FOR PORTRAIT LAYOUTS !-->
        <FrameLayout
            android:id="@+id/adLayout"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center_horizontal"
            android:layout_marginTop="5dp"
            android:baselineAligned="false"
            android:orientation="vertical"/>
    </LinearLayout>
    

    组 xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        >
    
        <TextView
            android:id="@+id/textGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="17dp"
            android:layout_marginTop="2dp"
            android:layout_weight="7"
            android:textStyle="bold"
            android:textSize="13sp" />
    
        <ImageView
    
            android:id="@+id/sExp_BtnAdd"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_gravity="center_vertical"
            android:contentDescription=""
            android:focusable="false"
            android:scaleType="centerCrop"
            android:src="@android:drawable/ic_input_add" />
    
    </LinearLayout>
    

    子 xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/textChild"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="?android:attr/expandableListPreferredItemPaddingLeft"
            android:layout_marginTop="2dp"
            android:textColor="@android:color/white"
            android:layout_weight="1"
            android:textSize="13sp" />
    
        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginEnd="?android:attr/expandableListPreferredItemPaddingLeft"
            android:id="@+id/sExp_BtnEdit"
            android:layout_gravity="center_vertical"
            android:src="@android:drawable/ic_menu_edit"
            android:scaleType="centerCrop"
            android:focusable="false"
            android:layout_marginRight="5dp" />
    
    </LinearLayout>
    

    呃……这篇文章有点长,希望对你有帮助!

    【讨论】:

    • 感谢您尝试帮助我,我已经按照您的建议完成了 - 用视图替换了按钮并添加了 onTouch 事件,但不幸的是我的结果没有改变。我添加了我的活动代码,请查看它,也许你会发现那里有问题。
    • 即使您没有回答我的评论,但您的回答表明您对这个问题进行了真正的尝试并对其进行了模拟以了解发生了什么,尽管它对我没有帮助(看到接受的答案),我决定给你赏金:)
    • 谢谢@movsar,你真好。你是绝对正确的,很抱歉没有回击你。阅读接受的答案后,我也不知道为什么问题出在背景上,但我无法重现您遇到的完全相同的问题,值得深思吗?再次感谢!
    【解决方案2】:

    您是否尝试过在两个列表项中设置根布局参数

    android:layout_height="match_parent"
    

    android:layout_height="wrap_content"
    

    ?

    【讨论】:

      【解决方案3】:

      Android 是为多屏设计的,所以有时一个布局文件不能很好地支持某些屏幕。一个建议可能会对您有所帮助:

      对原item的layout文件做一些调整,在tablet右边,然后保存并把调整后的文件放到对应的目录下,如下:

       res/layout/my_layout.xml              // layout for normal screen size ("default")
       res/layout-large/my_layout.xml        // layout for large screen size
       res/layout-xlarge/my_layout.xml       // layout for extra-large screen size
       res/layout-xlarge-land/my_layout.xml  // layout for extra-large in landscape orientation
      

      而 xlarge 屏幕至少为 960dp x 720dp, 大屏幕至少为 640dp x 480dp, 普通屏幕至少为 470dp x 320dp, 小屏幕至少为 426dp x 320dp。

      关于这个主题的官方文档在这里,https://developer.android.com/guide/practices/screens_support.html#qualifiers

      我认为这是处理普通布局上的异常行为的更好解决方案。

      【讨论】:

        【解决方案4】:

        嗯,我找到了答案,就是这样——你应该为布局显式设置背景,设置为 explist 还是根元素并不重要,必须设置它。

        除非我在包含 explist 的活动布局中设置了背景,否则它不会开始与任何建议的解决方案一起使用。

        有趣的问题 - 为什么会这样?!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-18
          • 1970-01-01
          • 2022-12-09
          • 1970-01-01
          相关资源
          最近更新 更多