ในการExpandableListView
จะมีวิธีที่จะซ่อนตัวบ่งชี้กลุ่มสำหรับกลุ่มที่มีเด็กไม่ได้หรือไม่
ในการExpandableListView
จะมีวิธีที่จะซ่อนตัวบ่งชี้กลุ่มสำหรับกลุ่มที่มีเด็กไม่ได้หรือไม่
คำตอบ:
ลองดู >>>
สำหรับรายการทั้งหมด
getExpandableListView().setGroupIndicator(null);
ใน xml
android:groupIndicator="@null"
android:groupIndicator
คุณสมบัติใช้รัฐเปิดการใช้งาน drawable นั่นคือคุณสามารถตั้งค่ารูปภาพที่แตกต่างกันสำหรับสถานะต่างๆ
เมื่อกลุ่มไม่มีลูกสถานะที่เกี่ยวข้องคือ 'state_empty'
ดูลิงค์อ้างอิงเหล่านี้:
สำหรับstate_empty
คุณสามารถตั้งค่าภาพอื่นที่ไม่สับสนหรือใช้สีโปร่งใสเพื่อไม่แสดงอะไร ...
เพิ่มรายการนี้ในสถานะเบิกได้ของคุณพร้อมกับคนอื่น ๆ ....
<item android:state_empty="true" android:drawable="@android:color/transparent"/>
ดังนั้นสถิติของคุณอาจเป็นดังนี้:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_empty="true" android:drawable="@android:color/transparent"/>
<item android:state_expanded="true" android:drawable="@drawable/my_icon_max" />
<item android:drawable="@drawable/my_icon_min" />
</selector>
ในกรณีที่คุณใช้ ExpandableListActivity คุณสามารถตั้งค่า groupindicator ใน onCreate ได้ดังนี้:
getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.my_group_statelist));
ฉันได้ทดสอบแล้วว่าใช้งานได้จริง
จากคำตอบของ StrayPointer และรหัสจากบล็อกคุณสามารถลดความซับซ้อนของโค้ดได้มากขึ้น:
ใน xml ของคุณเพิ่ม folowing ใน ExpandableListView:
android:groupIndicator="@android:color/transparent"
จากนั้นในอะแดปเตอร์คุณทำสิ่งต่อไปนี้:
@Override
protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean){
**...**
if ( getChildrenCount( groupPosition ) == 0 ) {
indicator.setVisibility( View.INVISIBLE );
} else {
indicator.setVisibility( View.VISIBLE );
indicator.setImageResource( isExpanded ? R.drawable.list_group_expanded : R.drawable.list_group_closed );
}
}
ด้วยการใช้เมธอด setImageResource คุณจะทำทุกอย่างได้ด้วยซับเดียว คุณไม่ต้องการอาร์เรย์จำนวนเต็มสามอาร์เรย์ในอะแด็ปเตอร์ของคุณ คุณไม่จำเป็นต้องมีตัวเลือก XML สำหรับสถานะที่ขยายและยุบ ทั้งหมดทำได้ผ่าน Java
นอกจากนี้วิธีนี้ยังแสดงตัวบ่งชี้ที่ถูกต้องเมื่อกลุ่มถูกขยายโดยค่าเริ่มต้นสิ่งที่ใช้ไม่ได้กับโค้ดจากบล็อก
getGroupView()
วิธีการBaseExpandableListAdapter
ใช้งานของคุณ ดูตัวอย่างการใช้งานนี้
ViewHolder
แพทเทิร์น indicator
คือชื่อตัวแปรของตัวยึดมุมมอง
ดังที่ได้กล่าวไว้ในคำตอบที่แตกต่างกันเนื่องจาก Android ถือว่ากลุ่มรายการที่ไม่ได้ขยายนั้นว่างเปล่าไอคอนจึงไม่ถูกวาดแม้ว่ากลุ่มนั้นจะมีลูกก็ตาม
ลิงค์นี้แก้ปัญหาให้ฉัน: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html
โดยทั่วไปคุณต้องตั้งค่าเริ่มต้น drawable เป็นโปร่งใสย้าย drawable ไปยังมุมมองกลุ่มของคุณเป็น ImageView และสลับรูปภาพในอะแดปเตอร์ของคุณ
ในรหัสของคุณเพียงแค่ใช้ XML แบบกำหนดเองสำหรับรายชื่อกลุ่มและในการที่ใส่ImageViewสำหรับGroupIndicator
และเพิ่มอาร์เรย์ด้านล่างในExpandableListAdapterของคุณ
private static final int[] EMPTY_STATE_SET = {};
private static final int[] GROUP_EXPANDED_STATE_SET = { android.R.attr.state_expanded };
private static final int[][] GROUP_STATE_SETS = { EMPTY_STATE_SET, // 0
GROUP_EXPANDED_STATE_SET // 1
};
นอกจากนี้ในวิธีการของ ExpandableListAdapter จะเพิ่มสิ่งเดียวกันกับด้านล่าง
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
{
if (convertView == null)
{
LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.row_group_list, null);
}
//Image view which you put in row_group_list.xml
View ind = convertView.findViewById(R.id.iv_navigation);
if (ind != null)
{
ImageView indicator = (ImageView) ind;
if (getChildrenCount(groupPosition) == 0)
{
indicator.setVisibility(View.INVISIBLE);
}
else
{
indicator.setVisibility(View.VISIBLE);
int stateSetIndex = (isExpanded ? 1 : 0);
Drawable drawable = indicator.getDrawable();
drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
}
}
return convertView;
}
อ้างอิง: http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html
ใน XML
android:groupIndicator="@null"
ในExpandableListAdapter
-> getGroupView
คัดลอกรหัสต่อไปนี้
if (this.mListDataChild.get(this.mListDataHeader.get(groupPosition)).size() > 0){
if (isExpanded) {
arrowicon.setImageResource(R.drawable.group_up);
} else {
arrowicon.setImageResource(R.drawable.group_down);
}
}
นี่อาจเป็นอีกวิธีหนึ่งจาก XML ตั้งค่า android:groupIndicator="@null"
ลิงค์อ้างอิง: https://stackoverflow.com/a/5853520/2624806
แนะนำวิธีแก้ปัญหาของฉัน:
1) ล้างกลุ่มเริ่มต้นตัวบ่งชี้:
<ExpandableListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="240dp"
android:layout_gravity="start"
android:background="#cccc"
android:groupIndicator="@android:color/transparent"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
/>
2) ใน ExpandableAdapter:
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = new TextView(context);
}
((TextView) convertView).setText(groupItem.get(groupPosition));
((TextView) convertView).setHeight(groupHeight);
((TextView) convertView).setTextSize(groupTextSize);
//create groupIndicator using TextView drawable
if (getChildrenCount(groupPosition)>0) {
Drawable zzz ;
if (isExpanded) {
zzz = context.getResources().getDrawable(R.drawable.arrowup);
} else {
zzz = context.getResources().getDrawable(R.drawable.arrowdown);
}
zzz.setBounds(0, 0, groupHeight, groupHeight);
((TextView) convertView).setCompoundDrawables(null, null,zzz, null);
}
convertView.setTag(groupItem.get(groupPosition));
return convertView;
}
แค่อยากจะปรับปรุงคำตอบของ Mihir Trivedi คุณสามารถวางสิ่งนี้ภายใน getGroupView () ที่อยู่ในคลาส MyExpandableListAdapter
View ind = convertView.findViewById(R.id.group_indicator);
View ind2 = convertView.findViewById(R.id.group_indicator2);
if (ind != null)
{
ImageView indicator = (ImageView) ind;
if (getChildrenCount(groupPosition) == 0)
{
indicator.setVisibility(View.INVISIBLE);
}
else
{
indicator.setVisibility(View.VISIBLE);
int stateSetIndex = (isExpanded ? 1 : 0);
/*toggles down button to change upwards when list has expanded*/
if(stateSetIndex == 1){
ind.setVisibility(View.INVISIBLE);
ind2.setVisibility(View.VISIBLE);
Drawable drawable = indicator.getDrawable();
drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
}
else if(stateSetIndex == 0){
ind.setVisibility(View.VISIBLE);
ind2.setVisibility(View.INVISIBLE);
Drawable drawable = indicator.getDrawable();
drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
}
}
}
... และสำหรับมุมมองเค้าโครงนี่คือลักษณะที่ group_items.xml ของฉันดูเหมือนจะเป็น
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/group_heading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:textSize="15sp"
android:textStyle="bold"/>
<ImageView
android:id="@+id/group_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/arrow_down_float"
android:layout_alignParentRight="true"
android:paddingRight="20dp"
android:paddingTop="20dp"/>
<ImageView
android:id="@+id/group_indicator2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/arrow_up_float"
android:layout_alignParentRight="true"
android:visibility="gone"
android:paddingRight="20dp"
android:paddingTop="20dp"/>
หวังว่าจะช่วยได้ ... อย่าลืมโหวตให้คะแนน
ใช้สิ่งนี้มันทำงานได้ดีสำหรับฉัน
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/group_indicator_expanded" android:state_empty="false" android:state_expanded="true"/>
<item android:drawable="@drawable/group_indicator" android:state_empty="true"/>
<item android:drawable="@drawable/group_indicator"/>
</selector>
คุณได้พยายามเปลี่ยนExpandableListView
แอตทริบิวต์ของandroid:groupIndicator="@null"
?
เพียงแค่คุณสร้างเลย์เอาต์ xml ใหม่ที่มี height = 0 สำหรับส่วนหัวของกลุ่มที่ซ่อนอยู่ ตัวอย่างเช่น 'group_list_item_empty.xml'
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="0dp">
</RelativeLayout>
จากนั้นรูปแบบส่วนหัวของกลุ่มปกติของคุณคือ 'your_group_list_item_file.xml'
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="48dp"
android:orientation="horizontal">
...your xml layout define...
</LinearLayout>
สุดท้ายคุณเพียงอัปเดตเมธอด getGroupView ในคลาสอะแดปเตอร์ของคุณ:
public class MyExpandableListAdapter extends BaseExpandableListAdapter{
//Your code here ...
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup viewGroup) {
if (Your condition to hide the group header){
if (convertView == null || convertView instanceof LinearLayout) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.group_list_item_empty, null);
}
return convertView;
}else{
if (convertView == null || convertView instanceof RelativeLayout) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.your_group_list_item_file, null);
}
//Your code here ...
return convertView;
}
}
}
สำคัญ : แท็กรูทของไฟล์เลย์เอาต์ (ซ่อนและปกติ) ต้องแตกต่างกัน (ดังตัวอย่างข้างบน LinearLayout และ RelativeLayout)
convertView.setVisibility (View.GONE) ควรทำเคล็ดลับ
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
DistanceHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_search_distance_header, parent, false);
if (getChildrenCount(groupPosition)==0) {
convertView.setVisibility(View.GONE);
}