在多层次ExpandableListView项目并不总是点击 [英] items in multi level ExpandableListView not always clickable

查看:192
本文介绍了在多层次ExpandableListView项目并不总是点击的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

予制成的通常的3级ExpandableListView根据互联网上的许多实施例和它工作得很好。

I made an usual 3-level ExpandableListView based on the many examples on the internet and it works well.

通过一个警告。点击第二和第三级别的并不总是工作。虽然有时它工作正常。通常在启动它的工作原理无处不在。那么它不工作了,上的物品,如50%。没有任何逻辑。有时我展开第2个组,然后我无法折叠该组了。有时我展开第2个组,然后我不能垮任何其他组第二的水平。唯一一致的是,它常常被固定的滚动锁定视图出可见区域和回

With one caveat. Clicking on the 2nd and 3rd level does not work always. Although sometimes it works fine. Usually at start it works everywhere. Then it does not work anymore, on like 50% of the items. Without any logic. Sometimes I expand a 2nd group and then I cannot collapse that group anymore. Or sometimes I expand a 2nd group and then I cannot collapse any other group of the 2nd level. The only consistent thing is that it often gets fixed by scrolling the locked up view out of the visible area and back in.

可能是什么回事?

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chooselib);

        //...

        ExpandableListView lv = (ExpandableListView) findViewById(R.id.libListView);
        lv.setAdapter(new LibraryListAdapter());
    }

    final List<String> states = new ArrayList<String>();
    final List<List<String>> cities = new ArrayList<List<String>>();
    final List<List<List<Map<String, String>>>> localLibs = new ArrayList<List<List<Map<String, String>>>>();



    public abstract class LibraryListBaseAdapter extends BaseExpandableListAdapter{ //changing these functions has no effect whatsoever on the problem
        @Override
        public Object getChild(int groupPosition, int childPosition)
        {
            return getChildId(groupPosition, childPosition);
        }

        @Override
        public long getChildId(int groupPosition, int childPosition)
        {
            return (groupPosition << 15) + childPosition + 1;
        }

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

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

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

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


    public class LibraryListAdapter extends LibraryListBaseAdapter
    {
        Map<Integer, ExpandableListView> cache = new TreeMap<Integer, ExpandableListView>();
        @Override
        public View getChildView(final int groupPosition, final int childPosition,
                                 boolean isLastChild, View convertView, ViewGroup parent)
        {
            if (cache.containsKey(groupPosition*10000 + childPosition))
                return cache.get(groupPosition*10000 + childPosition);
            LibraryListCityView l = new LibraryListCityView();
            l.setPadding((int)(60 * getResources().getDisplayMetrics().density), l.getPaddingTop(), l.getPaddingRight(), l.getPaddingBottom());
            //l.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); has no effect whatsoever
            //l.setFocusable(true); has no effect whatsoever

            l.setAdapter(new LibraryListCityAdapter(groupPosition,childPosition));
            if (cities.get(groupPosition).size() == 1) l.expandGroup(0);

            l.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
                @Override
                public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int lib, long l) {
                    onLeafClick(groupPosition,childPosition,lib);
                    return false;
                }
            });

            cache.put(groupPosition*10000 + childPosition, l);
            return l;
        }

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

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

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                                 View convertView, ViewGroup parent)
        {
            View row = //convertView != null && convertView instanceof TextView ? convertView :
                    getLayoutInflater().inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
            ((TextView) row).setText(states.get(groupPosition));
            return row;
        }
    }

    public class LibraryListCityView extends ExpandableListView
    {
        int intGroupPosition, intChildPosition, intGroupid;
        public LibraryListCityView()
        {
            super(LibraryList.this);
        }
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            widthMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY);
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(2000, MeasureSpec.AT_MOST); //what does this do?
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }

        //from http://stackoverflow.com/questions/19298155/issue-with-expanding-multi-level-expandablelistview
        @Override
        protected void onDetachedFromWindow() {
            try {
                super.onDetachedFromWindow();
            } catch (IllegalArgumentException e) {
                // TODO: Workaround for http://code.google.com/p/android/issues/detail?id=22751
            }
        }
    }

    public class LibraryListCityAdapter extends LibraryListBaseAdapter
    {
        int state,city;

        LibraryListCityAdapter (int a, int b) {
            state = a;
            city = b;
        }

        @Override
        public View getChildView(int groupPosition, int childPosition,
                                 boolean isLastChild, View convertView, ViewGroup parent)
        {
            //todo: use convertView (but do not want to mix groupView/childView up)
            View row = getLayoutInflater().inflate(R.layout.libraryinlistview , parent, false);
            ((TextView) row).setText(localLibs.get(state).get(city).get(childPosition).get("NAME"));
            return row;
        }

        @Override
        public int getChildrenCount(int groupPosition)
        {
            return localLibs.get(state).get(city).size();
        }


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

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                                 View convertView, ViewGroup parent)
        {
            View row = getLayoutInflater().inflate(R.layout.librarycityinlistview, parent, false);
            ((TextView) row).setText(cities.get(state).get(city));
            return row;
        }

    }

chooselib.xml:

chooselib.xml:

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

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/lay_chooselib_choose"
            android:id="@+id/textView" android:layout_gravity="center_vertical|left" android:padding="5sp"/>
    <ExpandableListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/libListView" android:layout_gravity="right|center_vertical"
            />
</LinearLayout>

librarycityinlistview.xml:

librarycityinlistview.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@android:id/text1"
          android:layout_width="fill_parent"
          android:layout_height="?android:attr/listPreferredItemHeight"
          android:gravity="center_vertical"
          android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"
          android:singleLine="true"
          android:textAppearance="?android:attr/textAppearanceListItem"
        />

libraryinlistview.xml:

libraryinlistview.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@android:id/text1"
          android:layout_width="fill_parent"
          android:layout_height="?android:attr/listPreferredItemHeight"
          android:paddingLeft="60dip"
          android:gravity="center_vertical"
        />

听起来像是 HTTPS一点:// code.google.com/p/android/issues/detail?id=3414 但那种是相反的(因为有问题的列表中的项目外列表视图),并改变descand可聚焦并没有改变任何东西。 (因为只有textviews在列表中,他们都不可作为焦点,反正)。而没有在logcat中非常有用,太

Sounds a little like https://code.google.com/p/android/issues/detail?id=3414 but kind of is the opposite (since the problematic list is an item to the outer list view), and changing descand focusability did not change anything. (since only textviews are in the list they are not focusable anyways). And nothing useful in the logcat, too

我真的不明白我根据源是在onMeasure的东西。和列表视图的团体和儿童之间的分裂。也许最好是对第一级可扩展列表视图对于每个组,而不是一个为第2级各组?

What I do not really understand of the source I based on is the stuff in onMeasure. And the split between the groups and children of the listviews. Perhaps it is better to have an expandable list view for every group on the 1st level, instead one for every group on the 2nd level?

推荐答案

尝试将您的点击监听器每个 getChildView getGroupView 方法

Try to attach your click listener on eachgetChildView and getGroupViewmethods

public class LibraryListAdapter extends LibraryListBaseAdapter
{
    Map<Integer, ExpandableListView> cache = new TreeMap<Integer, ExpandableListView>();
    @Override
    public View getChildView(final int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent)
    {
        if (cache.containsKey(groupPosition*10000 + childPosition))
            return cache.get(groupPosition*10000 + childPosition);
        LibraryListCityView l = new LibraryListCityView();
        l.setPadding((int)(60 * getResources().getDisplayMetrics().density), l.getPaddingTop(), l.getPaddingRight(), l.getPaddingBottom());
        //l.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); has no effect whatsoever
        //l.setFocusable(true); has no effect whatsoever

        l.setAdapter(new LibraryListCityAdapter(groupPosition,childPosition));
        if (cities.get(groupPosition).size() == 1) l.expandGroup(0);



        cache.put(groupPosition*10000 + childPosition, l);
        l.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Log.d("LibraryListAdapter"," group clicked :  " + groupPosition + "childClicked :" + childPosition);

                    }
                });
        return l;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent)
    {
        View row =// convertView != null && convertView instanceof TextView ? convertView :
                getLayoutInflater().inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
        ((TextView) row).setText(states.get(groupPosition));

        row.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Log.d("LibraryListAdapter"," group clicked :  " + groupPosition);

                    }
                });
        return row;
    }
}



public class LibraryListCityAdapter extends LibraryListBaseAdapter
{

    @Override
    public View getChildView(int groupPosition, int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent)
    {
        //todo: use convertView (but do not want to mix groupView/childView up)
        View row = getLayoutInflater().inflate(R.layout.libraryinlistview , parent, false);
        ((TextView) row).setText(localLibs.get(state).get(city).get(childPosition).get("NAME"));
        row.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Log.d("LibraryListCityAdapter"," group clicked :  " + groupPosition + " childClicked :" + childPosition);


                    }
                });
        return row;
    }


    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent)
    {
        View row = getLayoutInflater().inflate(R.layout.librarycityinlistview, parent, false);
        ((TextView) row).setText(cities.get(state).get(city));
        rowsetText(localLibs.get(state).get(city).get(childPosition).get("NAME"));
        row.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Log.d("LibraryListCityAdapter"," group clicked :  " + groupPosition );


                    }
                });
        return row;
    }

}

我所做的更改只是在getGroupView和getChildView方法和删除 从上部列表视图setOnChildClickListener

The changes I made was only on the getGroupView and getChildView methods and delete the setOnChildClickListener from the upper Listview

这篇关于在多层次ExpandableListView项目并不总是点击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆