Android BaseExpandableListAdapter многократно запускает метод GetChildView

Мне нужно использовать Android ExpandableListView с настраиваемым макетом для каждой группы (у групп есть один дочерний элемент). Для этого я создал класс, расширяющий BaseExpandableListAdapter. В методе getChildView я создал представление каждого дочернего элемента. Оно работает. Когда я щелкаю группу, ее дочерний элемент имеет истинный макет. Однако во время отладки я вижу, что он много раз запускает метод getchildview, поэтому он слишком медленный для отображения дочернего элемента. Потому что над каждым дочерним элементом выполняется множество операций (операции с БД, динамические подмакеты...).

Есть небольшой проект, который похож на мой проект (логика и структура кода одинаковы, отличается только код макета и код создания каждого дочернего представления).

public class MainActivity extends Activity {

private ArrayList<String> groups;
private ArrayList<ArrayList<ArrayList<String>>> childs;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    ExpandableListView l = (ExpandableListView)findViewById(R.id.expandableListView1);

    loadData();


    final myExpandableAdapter adapter = new myExpandableAdapter(this, groups, childs);
    l.setAdapter(adapter);


}

public class myExpandableAdapter extends BaseExpandableListAdapter {

    private ArrayList<String> groups;

    private ArrayList<ArrayList<ArrayList<String>>> children;

    private Context context;

    public myExpandableAdapter(Context context, ArrayList<String> groups, ArrayList<ArrayList<ArrayList<String>>> children) {
        this.context = context;
        this.groups = groups;
        this.children = childs;
    }


    @Override
    public boolean areAllItemsEnabled()
    {
        return true;
    }


    public ArrayList<String> getChild(int groupPosition, int childPosition) {
        return children.get(groupPosition).get(childPosition);
    }

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


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

        String child=(String)getChild(groupPosition, childPosition).get(0);
         switch (groupPosition){

        case 0:
            LayoutInflater inflater =  (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.child_row, null);
            TextView tvPlayerName = (TextView) convertView.findViewById(R.id.tvPlayerName);
            tvPlayerName.setText(child);

            break;

        case 1:
            LayoutInflater inflater1 =  (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater1.inflate(R.layout.child_row1, null);
            TextView tvPlayerName1 = (TextView) convertView.findViewById(R.id.tvPlayerName);
            tvPlayerName1.setText(child);
            Button btn=(Button)convertView.findViewById(R.id.button1);
            btn.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    TextView tv=(TextView)findViewById(R.id.tv);
                    tv.setText("Clicked");
                }
            });

            break; 
        case 2:
            LayoutInflater inflater2 =  (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater2.inflate(R.layout.child_row1, null);
            TextView tvPlayerName12 = (TextView) convertView.findViewById(R.id.tvPlayerName);
            tvPlayerName12.setText(child);
            Button btn2=(Button)convertView.findViewById(R.id.button1);
            btn2.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    TextView tv=(TextView)findViewById(R.id.tv);
                    tv.setText("Clicked");
                }
            });

            break; 
     }
        return convertView;

    }

    public int getChildrenCount(int groupPosition) {
        return children.get(groupPosition).size();
    }

    public String getGroup(int groupPosition) {
        return groups.get(groupPosition);
    }

    public int getGroupCount() {
        return groups.size();
    }

    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

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

        String group = (String) getGroup(groupPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.expandablelistview_group, null);
        }

        TextView grouptxt = (TextView) convertView.findViewById(R.id.TextViewGroup);

        grouptxt.setText(group);

        return convertView;
    }

    public boolean hasStableIds() {
        return true;
    }

    public boolean isChildSelectable(int arg0, int arg1) {
        return true;
    }

}

private void loadData(){
    groups= new ArrayList<String>();
    childs= new ArrayList<ArrayList<ArrayList<String>>>();

    groups.add("Group 1");
    groups.add("Group 2");
    groups.add("Group 3");

    childs.add(new ArrayList<ArrayList<String>>());
    childs.get(0).add(new ArrayList<String>());
    childs.get(0).get(0).add("Child 1 group 1");


    childs.add(new ArrayList<ArrayList<String>>());
    childs.get(1).add(new ArrayList<String>());
    childs.get(1).get(0).add("Child 1 group 2");


    childs.add(new ArrayList<ArrayList<String>>());
    childs.get(2).add(new ArrayList<String>());
    childs.get(2).get(0).add("Child 1 group 3");

}}

Во время отладки, если я нажму на любую группу, она дойдет до строки String child=(String)getChild(groupPosition, childPosition).get(0);. После break; }return convertView; он снова и снова приходит туда, а затем отображает макет.

Activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ExpandableListView
    android:id="@+id/expandableListView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="34dp" >
</ExpandableListView>

expandablelistview_group.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"> 
<TextView
    android:id="@+id/TextViewGroup" 
    android:layout_width="wrap_content"
    android:layout_height="50px"
    android:layout_marginLeft="50px"
    android:gravity="center_vertical"
>
</TextView>

child_row.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"
android:orientation="vertical" >

<TextView
    android:id="@+id/tvPlayerName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="CheckBox" />

childrow1.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"
android:orientation="horizontal" >

    <TextView
    android:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Row1" />

<TextView
    android:id="@+id/tvPlayerName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />

Is there any suggestion to solve this.

Спасибо


person essbek    schedule 20.09.2012    source источник


Ответы (2)


вместо раздувания представления из getChildView используйте держатель прочитайте здесь

person Tomer Mor    schedule 20.09.2012

Попробуйте изменить XML-файл ExpandableListView и вместо android:layout_height="wrap_content" поставить android:layout_height="fill_parent"

person Apostolos    schedule 05.10.2012