在多层次ExpandableListView项目并不总是点击 [英] items in multi level ExpandableListView not always clickable
问题描述
予制成的通常的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 getGroupView
methods
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屋!