studio recyclerview item expandablelist ejemplo desplegable android listview expandablelistview

android - recyclerview - Cambiar indicador expandible en ExpandableListView



expandablelistview android ejemplo (6)

He ido por el camino de abajo: decide el drawable de izquierda / derecha para tu groupView basado en el flag isExpanded.
De esta forma, es más fácil para nosotros personalizar el relleno / fondo y otras cosas del indicador dibujable.

Espero eso ayude.

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = (TextView) mLayoutInflater.inflate(R.layout.menu_group, null); textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, isExpanded ? 0 : android.R.drawable.ic_menu_more, 0); textView.setText(getGroup(groupPosition).toString()); return textView; }

Estoy intentando crear una ExpandableListView. La vista inicial con los grupos se muestra bien. Sin embargo, cuando hago clic en el elemento de la lista, mi flecha no cambia. Vea las imágenes a continuación.

¿Cómo puedo cambiar la dirección de la flecha?

Tengo el diseño XML:

<ExpandableListView android:id="@+id/expandable_list" android:layout_width="fill_parent" android:layout_height="match_parent" android:divider="@null" android:background="#ffffff" android:groupIndicator="@drawable/settings_selector" android:transcriptMode="alwaysScroll" />

settings_selector.xml :

<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" > <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/arrow_down" android:state_empty="true"/> <item android:drawable="@drawable/arrow_right" android:state_expanded="true"/> </selector> </animation-list>


Pruébalo para tu settings_selector.xml :

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/arrow_right" android:state_expanded="true" /> <item android:drawable="@drawable/arrow_down" /> </selector>


Simplemente crea una vista / vista de imagen donde quieras en el ejemplo de elemento xml de grupo:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parent_group" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10dp"> <ImageView android:id="@+id/expandable_icon" android:layout_width="25dp" android:layout_height="25dp" android:layout_marginTop="6dp" android:src="@drawable/group_icon_not_expanded" /> <TextView android:id="@+id/group_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dp" android:fontFamily="@font/roboto_thin" android:textColor="@android:color/black" android:textSize="17sp" />

Y luego para su ExpandableListView use un GroupClickListener para cambiar la imagen de ImageView mediante programación, ejemplo:

listView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { parent.smoothScrollToPosition(groupPosition); if (parent.isGroupExpanded(groupPosition)) { ImageView imageView = v.findViewById(R.id.expandable_icon); imageView.setImageDrawable(getResources().getDrawable(R.drawable.group_icon_not_expanded)); } else { ImageView imageView = v.findViewById(R.id.expandable_icon); imageView.setImageDrawable(getResources().getDrawable(R.drawable.group_icon_expanded)); } return false ; } });


lista desplegable

<ExpandableListView android:id="@+id/expandable_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:groupIndicator="@drawable/group_indicator" android:transcriptMode="alwaysScroll" />

setindicator aquí iam usando el código setindicator como este esto funciona bien

DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int width = metrics.widthPixels; mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list); mExpandableList.setIndicatorBounds(width - GetPixelFromDips(50), width - GetPixelFromDips(10)); public int GetPixelFromDips(float pixels) { // Get the screen''s density scale final float scale = getResources().getDisplayMetrics().density; // Convert the dps to pixels, based on density scale return (int) (pixels * scale + 0.5f); }

res / drawable / group_indicator

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">     <item android:drawable="@drawable/arrow_right" android:state_empty="true"> </item>     <item android:drawable="@drawable/arrow_down" android:state_expanded="true"></item>      <item android:drawable="@drawable/arrow_right"></item> </selector>


tema:

int width = getResources().getDisplayMetrics().widthPixels; if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { listView.setIndicatorBounds(width - getPixelValue(40), width - getPixelValue(10)); } else { listView.setIndicatorBoundsRelative(width - getPixelValue(40), width - getPixelValue(10)); }

y método de ayuda:

public static int getPixelValue(int dp) { final float scale = getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); }


import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.database.DataSetObserver; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; public class MyActivity extends Activity { private ExpandableListView mExpandableList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list); mExpandableList.setGroupIndicator(null); ArrayList<Parent> arrayParents = new ArrayList<Parent>(); ArrayList<String> arrayChildren = new ArrayList<String>(); //here we set the parents and the children for (int i = 0; i < 10; i++){ //for each "i" create a new Parent object to set the title and the children Parent parent = new Parent(); parent.setTitle("Parent " + i); arrayChildren = new ArrayList<String>(); for (int j = 0; j < 10; j++) { arrayChildren.add("Child " + j); } parent.setArrayChildren(arrayChildren); //in this array we add the Parent object. We will use the arrayParents at the setAdapter arrayParents.add(parent); } //sets the adapter that provides data to the list. mExpandableList.setAdapter(new MyCustomAdapter(MyActivity.this,arrayParents)); } public class Parent { private String mTitle; private ArrayList<String> mArrayChildren; public String getTitle() { return mTitle; } public void setTitle(String mTitle) { this.mTitle = mTitle; } public ArrayList<String> getArrayChildren() { return mArrayChildren; } public void setArrayChildren(ArrayList<String> mArrayChildren) { this.mArrayChildren = mArrayChildren; } } public class MyCustomAdapter extends BaseExpandableListAdapter implements OnClickListener{ private LayoutInflater inflater; private ArrayList<Parent> mParent; public MyCustomAdapter(Context context, ArrayList<Parent> parent){ mParent = parent; inflater = LayoutInflater.from(context); } @Override //counts the number of group/parent items so the list knows how many times calls getGroupView() method public int getGroupCount() { return mParent.size(); } @Override //counts the number of children items so the list knows how many times calls getChildView() method public int getChildrenCount(int i) { return mParent.get(i).getArrayChildren().size(); } @Override //gets the title of each parent/group public Object getGroup(int i) { return mParent.get(i).getTitle(); } @Override //gets the name of each item public Object getChild(int i, int i1) { return mParent.get(i).getArrayChildren().get(i1); } @Override public long getGroupId(int i) { return i; } @Override public long getChildId(int i, int i1) { return i1; } @Override public boolean hasStableIds() { return true; } @Override //in this method you must set the text to see the parent/group on the list public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { if (view == null) { view = inflater.inflate(R.layout.list_item_parent, viewGroup,false); } view.findViewById(R.id.button).setTag(i); view.findViewById(R.id.button).setOnClickListener(this); TextView textView = (TextView) view.findViewById(R.id.list_item_text_view); //"i" is the position of the parent/group in the list textView.setText(getGroup(i).toString()); //return the entire view return view; } @Override //in this method you must set the text to see the children on the list public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) { if (view == null) { view = inflater.inflate(R.layout.list_item_child, viewGroup,false); } TextView textView = (TextView) view.findViewById(R.id.list_item_text_child); //"i" is the position of the parent/group in the list and //"i1" is the position of the child textView.setText(mParent.get(i).getArrayChildren().get(i1)); //return the entire view return view; } @Override public boolean isChildSelectable(int i, int i1) { return true; } @Override public void registerDataSetObserver(DataSetObserver observer) { /* used to make the notifyDataSetChanged() method work */ super.registerDataSetObserver(observer); } /* (non-Javadoc) * @see android.view.View.OnClickListener#onClick(android.view.View) * @since Mar 20, 2013 * @author rajeshcp */ @Override public void onClick(View v) { if(mExpandableList.isGroupExpanded((Integer)v.getTag())) { mExpandableList.collapseGroup((Integer)v.getTag()); }else { mExpandableList.expandGroup((Integer)v.getTag()); } } } }

Cambie su MyActivity así y dígame qué más quiere?