Расширяемый список Android

Я пытаюсь использовать пользовательский ExpandableListView с родительским и дочерним макетом с родительским XML и дочерним XML.

Мои данные будут ответом сервера. Поэтому я предпочитаю иметь данные в виде массива или Hash-карты для родительских и дочерних макетов

Я прилагаю изображения того, что хочу.

Можно ли изменить изображение стрелки расширяемого списка (по умолчанию) с помощью любого представления + или - UI, как показано ниже.

List

List1

Пожалуйста, предложите учебник или логику кода для этой конкретной ситуации.

Ответ 1

Между тем Я создал selector.xml как:

<?xml version="1.0" encoding="UTF-8"?>

<selector xmlns:android="schemas.android.com/apk/res/android" >

    <item
        android:drawable="@drawable/friend_small"
        android:state_expanded="true"/>

    <item android:drawable="@drawable/place_small"/>
</selector>

и приведенный в android:groupIndicator="@drawable/selector" в xml - friend_small и поместить маленькие - это мои изображения состояния разворачивания и свертывания

Ответ 2

После R и D над расширяемым списком я обнаружил, что расширяемый List-view представляет собой двухуровневое древовидное представление, предоставляемое Android.

Этот вид содержит два типа категорий.

Первый тип Групповые элементы, а второй - Child-Elements, также называемый родительским и дочерним элементами.

Основная цель этого примера - настроить расширяемый список-представление, как показывает изображение в вопросе.

Я рассмотрел некоторые важные темы о расширяемом представлении списка, с которым я столкнулся во время своего опыта.

Ниже код main.xml содержит расширяемый вид списка. 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/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:groupindicator="@drawable/group_indicator.xml">

     <textview android:id="@+id/android:empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="@string/main_no_items">       
</textview></expandablelistview></linearlayout>

group_row.xml выглядит следующим образом, который содержит макет для расширяемой структуры списка групп group.group_row.xml   

     <textview android:id="@+id/tvGroupName" android:layout_width="wrap_content" android:layout_height="40dip" android:textsize="16sp" android:textstyle="bold" android:paddingleft="30dip" android:gravity="center_vertical">

child_row.xml, это содержит макет для структуры группы с расширенным списком. child_row.xml

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="40dip" android:gravity="center_vertical">

    <textview android:id="@+id/tvPlayerName" android:paddingleft="50dip" android:textsize="14sp" android:layout_width="wrap_content" android:layout_height="30dip" android:gravity="center_vertical">

</textview></linearlayout>

Сначала прочитайте ссылку расширяемого списка из xml в класс активности.

 public class ExpList extends ExpandableListActivity
    {
     /**
      * strings for group elements
      */
        static final String arrGroupelements[] = 
        {
       "India",
       "Australia",
       "England",
       "South Africa"
     };

        /**
      * strings for child elements
      */
     static final String arrChildelements[][] = 
     {
       {
      "Sachin Tendulkar",
      "Raina",
      "Dhoni",
      "Yuvi"
       },
       {
      "Ponting",
      "Adam Gilchrist",
      "Michael Clarke"
       },
       {
      "Andrew Strauss",
      "kevin Peterson",
      "Nasser Hussain"
       },
       {
      "Graeme Smith",
      "AB de villiers",
      "Jacques Kallis"
       }
        };

     DisplayMetrics metrics;
     int width;
     ExpandableListView expList;

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            expList = getExpandableListView();
            metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            width = metrics.widthPixels;
            //this code for adjusting the group indicator into right side of the view


if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
            expList.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));
        } else {
            expList.setIndicatorBoundsRelative(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));
        }

            expList.setAdapter(new ExpAdapter(this));

      expList.setOnGroupExpandListener(new OnGroupExpandListener()
      {
       @Override
       public void onGroupExpand(int groupPosition) 
       {
        Log.e("onGroupExpand", "OK");
       }
      });

      expList.setOnGroupCollapseListener(new OnGroupCollapseListener()
      {
       @Override
       public void onGroupCollapse(int groupPosition) 
       {
        Log.e("onGroupCollapse", "OK");
       }
      });

      expList.setOnChildClickListener(new OnChildClickListener()
      {
       @Override
       public boolean onChildClick(ExpandableListView parent, View v,
         int groupPosition, int childPosition, long id) {
        Log.e("OnChildClickListener", "OK");
        return false;
       }
      });
        }

        public int GetDipsFromPixel(float pixels)
        {
         // Get the screen density scale
         final float scale = getResources().getDisplayMetrics().density;
         // Convert the dps to pixels, based on density scale
         return (int) (pixels * scale + 0.5f);
        }
    }

Для настройки опции Exp Listview главным является адаптер. Android предоставляет BaseExpandableListAdapter для настройки представления. Bellow - это код для дизайна адаптера.

Это адаптер для расширяемого списка-списка для создания группового и дочернего элементов.

public class ExpAdapter extends BaseExpandableListAdapter {

  private Context myContext;
  public ExpAdapter(Context context) {
   myContext = context;
  }
  @Override
  public Object getChild(int groupPosition, int childPosition) {
   return null;
  }

  @Override
  public long getChildId(int groupPosition, int childPosition) {
   return 0;
  }

  @Override
  public View getChildView(int groupPosition, int childPosition,
    boolean isLastChild, View convertView, ViewGroup parent) {

   if (convertView == null) {
    LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.child_row, null);
   }

   TextView tvPlayerName = (TextView) convertView.findViewById(R.id.tvPlayerName);
   tvPlayerName.setText(arrChildelements[groupPosition][childPosition]);

   return convertView;
  }

  @Override
  public int getChildrenCount(int groupPosition) {
   return arrChildelements[groupPosition].length;
  }

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

  @Override
  public int getGroupCount() {
   return arrGroupelements.length;
  }

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

  @Override
  public View getGroupView(int groupPosition, boolean isExpanded,
    View convertView, ViewGroup parent) {

   if (convertView == null) {
    LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.group_row, null);
   }

   TextView tvGroupName = (TextView) convertView.findViewById(R.id.tvGroupName);
   tvGroupName.setText(arrGroupelements[groupPosition]);

   return convertView;
  }

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

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

group_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/friend_small" />
        <item android:drawable="@drawable/place_small" />
    </selector>

Ответ 3

вы можете изменить индикатор, вызвав setGroupIndicator

Расширяемые списки могут показывать индикатор рядом с каждым элементом, чтобы отобразить текущее состояние элемента (состояния обычно представляют собой расширенную группу, свернутую группу, дочерний элемент или последний ребенок). Используйте setChildIndicator (Drawable) или setGroupIndicator (Drawable) (или соответствующие атрибуты XML) для установки этих индикаторов (см. Документы для каждого метода, чтобы увидеть дополнительное состояние, которое может иметь каждый Drawable).

Кроме того, вам нужна ваша реализация ExpandableListAdapter. возможно раздувать ваши собственные взгляды как для родителей, так и для детей.