Java 更改 ExpandableListView 中指示器的位置导致问题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18941405/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Changing the location of indicator in ExpandableListView causing problems
提问by Guy
I'm trying to set my indicator to be next to the textview, but I just can't get the right code to do it.
我试图将我的指示器设置在 textview 旁边,但我无法获得正确的代码来做到这一点。
XML:
XML:
<TextView
android:id="@+id/lblListHeader"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
android:textColor="#000000"
android:textSize="17dp" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/lblListHeader"
android:src="@drawable/custom_arrow" />
This is the only stack of code that I have found researching but I can't get it to work:
这是我发现研究的唯一代码堆栈,但我无法让它工作:
//inside getGropView method
View v;
if (convertView == null) {
v = newGroupView(isExpanded, parent);
} else {
v = convertView;
}
bindView(v, mGroupData.get(groupPosition), mGroupFrom, mGroupTo);
((ImageView) v.findViewById(R.id.videos_group_indicator))
.setImageResource(isExpanded?R.drawable.videos_chevron_expanded:R.drawable.videos_chevron_collapsed);
return v;
The main problem is that it "underlines" the newGroupView method etc. because I don't have such method and it is not mentioned how to create it in the exampleI was looking at.
主要问题是它“强调”了 newGroupView 方法等,因为我没有这样的方法,并且在我正在查看的示例中没有提到如何创建它。
Also, once I get the solution, could someone please try and explain this code to me? I have read it through a lot of time and I just can't get myself to understand it, I'm a beginner.
另外,一旦我得到解决方案,有人可以尝试向我解释这段代码吗?我已经阅读了很多时间,但我无法让自己理解它,我是初学者。
采纳答案by Alexander.Iljushkin
Here's an example of custom expandable list view:
这是自定义可扩展列表视图的示例:
What you want to see if you apply this code in your new project:
如果在新项目中应用此代码,您希望看到什么:
create this code into activity
将此代码创建为活动
public class ExpActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Находим наш list
ExpandableListView listView = (ExpandableListView)findViewById(R.id.exListView);
//Создаем набор данных для адаптера
ArrayList<ArrayList<String>> groups = new ArrayList<ArrayList<String>>();
ArrayList<String> children1 = new ArrayList<String>();
ArrayList<String> children2 = new ArrayList<String>();
children1.add("Child_1");
children1.add("Child_2");
groups.add(children1);
children2.add("Child_1");
children2.add("Child_2");
children2.add("Child_3");
groups.add(children2);
//Создаем адаптер и передаем context и список с данными
ExpListAdapter adapter = new ExpListAdapter(getApplicationContext(), groups);
listView.setAdapter(adapter);
}
}
add expandableListView into main.xml
将 expandableListView 添加到 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ExpandableListView
android:id="@+id/exListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:indicatorLeft="250dp"
android:indicatorRight="300dp"
/>
</LinearLayout>
create an adapter class
创建一个适配器类
public class ExpListAdapter extends BaseExpandableListAdapter {
private ArrayList<ArrayList<String>> mGroups;
private Context mContext;
public ExpListAdapter (Context context,ArrayList<ArrayList<String>> groups){
mContext = context;
mGroups = groups;
}
@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.group_view, null);
}
if (isExpanded){
//Изменяем что-нибудь, если текущая Group раскрыта
}
else{
//Изменяем что-нибудь, если текущая Group скрыта
}
TextView textGroup = (TextView) convertView.findViewById(R.id.textGroup);
textGroup.setText("Group " + Integer.toString(groupPosition));
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.child_view, null);
}
TextView textChild = (TextView) convertView.findViewById(R.id.textChild);
textChild.setText(mGroups.get(groupPosition).get(childPosition));
Button button = (Button)convertView.findViewById(R.id.buttonChild);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext,"button is pressed",5000).show();
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
the names of methods and parameters is quite informative. methods getGroupView and getChildView returns View for pparents
and children
accordingly. using the parameter isExpanded in the method getGroupView, we ca, for instance, change the back of group in different states. using LayoutInflater we use custom layout for our list.
方法和参数的名称非常有用。方法 getGroupView 和 getChildView 返回 p 的视图,parents
并children
相应地返回视图。使用getGroupView方法中的参数isExpanded,我们可以例如改变不同状态下的group的back。使用 LayoutInflater 我们为我们的列表使用自定义布局。
group_view.xml
group_view.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">
<TextView
android:id="@+id/textGroup"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="20dp"
android:textColor="@android:color/white"
android:textStyle="bold"
/>
</LinearLayout>
child_view.xml
child_view.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">
<TextView
android:id="@+id/textChild"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:textColor="@android:color/white"
/>
<Button
android:id="@+id/buttonChild"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_marginLeft="150dp"
android:layout_marginTop="10dp"
android:text="Button"
android:focusable="false"
/>
</LinearLayout>
in the child view we added a button, in the adapter method getChildView controlling its pressed. in the similar way we can add buttons and other elements in group_view.xml .
在子视图中我们添加了一个按钮,在适配器方法 getChildView 中控制其按下。以类似的方式,我们可以在 group_view.xml 中添加按钮和其他元素。
also, we can pin listeners to our list.
此外,我们可以将听众固定到我们的列表中。
?OnChildClickListener — pressing on an element ?OnGroupCollapseListener – collapsing group ?OnGroupExpandListener – expanding group ?OnGroupClickListener – press on group
?OnChildClickListener — 按下一个元素 ?OnGroupCollapseListener – 折叠组 ?OnGroupExpandListener – 扩展组 ?OnGroupClickListener – 按下组
now lets look at groupIndicater - indicator of the group state. it's placement pointed in main.xml with parameters indicatorLeft, indicatorRigh - corresponding to left and right border. by default the indicator placed on the left side, what is not so cool.
现在让我们看看 groupIndicer - 组状态的指示器。它位于 main.xml 中,参数indicatorLeft、indicatorRigh - 对应于左右边框。默认情况下,指示器放置在左侧,有什么不那么酷的。
also we can add custom images, for that, we need to add indicator.xml in the folder drawable with this code.
我们也可以添加自定义图像,为此,我们需要使用此代码在 drawable 文件夹中添加 indicator.xml。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_expanded="true"
android:drawable="@drawable/imageOpen">
</item>
<item android:state_empty="true"
android:drawable="@drawable/imageClose">
</item>
</selector>
where imageOpen is for expanded group imageClose is for collapsed group
其中 imageOpen 用于展开组 imageClose 用于折叠组
next time we need to add a row for parameters of our list in main.xml
下次我们需要在 main.xml 中为列表的参数添加一行
android:groupIndicator="@drawable/indicator"