Android ExpandableListView子项也在没有ViewHolder的情况下相互依赖

时间:2017-06-27 15:23:33

标签: android expandablelistview android-viewholder

我实施了一个小应用程序,检查了我在一个更大的应用程序中的一些ExpandableListView错误。我通过thisthat帖阅读并完成了工作。但后来我决定在第一次运行时不使用ViewHolder模式实现ExpandableListView适配器。

但是在打开和关闭父视图时我仍然有一个错误。这是我的MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.exp_list_view);

        List<Parent> parentList = new ArrayList<>();
        Parent parent;

        List<Child> childList;

        childList = new ArrayList<>();
        childList.add(new Child("One")); childList.add(new Child("Two")); childList.add(new Child("Three"));

        parent = new Parent("First", childList);
        parentList.add(parent);

        childList = new ArrayList<>();
        childList.add(new Child("One")); childList.add(new Child("Two")); childList.add(new Child("Three"));

        parent = new Parent("Second", childList);
        parentList.add(parent);

        childList = new ArrayList<>();
        childList.add(new Child("One")); childList.add(new Child("Two")); childList.add(new Child("Three"));

        parent = new Parent("Third", childList);
        parentList.add(parent);

        childList = new ArrayList<>();
        childList.add(new Child("One")); childList.add(new Child("Two")); childList.add(new Child("Three"));

        parent = new Parent("Forth", childList);
        parentList.add(parent);

        final MyAdapter adapter = new MyAdapter(this, parentList);
        expandableListView.setAdapter(adapter);
    }
}

我的适配器类:

class MyAdapter extends BaseExpandableListAdapter {


    private final List<Parent> mParentList;
    private final Context mContext;

    public MyAdapter(final Context context, final List<Parent> parentList) {
        mContext = context;
        mParentList = parentList;
    }

    @Override
    public int getGroupCount() {
        return mParentList.size();
    }

    @Override
    public int getChildrenCount(final int groupPosition) {
        return mParentList.get(groupPosition).getChildList().size();
    }

    @Override
    public Object getGroup(final int groupPosition) {
        return mParentList.get(groupPosition);
    }

    @Override
    public Object getChild(final int groupPosition, final int childPosition) {
        return mParentList.get(groupPosition).getChildList().get(childPosition);
    }

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

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

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

    @Override
    public View getGroupView(final int groupPosition, final boolean isExpanded, final View convertView, final ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater inflater = LayoutInflater.from(mContext);
            v = inflater.inflate(R.layout.row_parent, parent, false);
        }
        TextView tvn = (TextView) v.findViewById(R.id.tv_parent_name);
        tvn.setText(mParentList.get(groupPosition).getName());
        return v;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition, final boolean isLastChild, final View convertView, final ViewGroup parent) {
        View row = convertView;
        if (row == null) {
            LayoutInflater inflater = LayoutInflater.from(mContext);
            row = inflater.inflate(R.layout.row_child, parent, false);
        }
        TextView tvn = (TextView) row.findViewById(R.id.tv_child_name);
        Switch sw = (Switch) row.findViewById(R.id.sw_child);
        tvn.setText(mParentList.get(groupPosition).getChildList().get(childPosition).getName());
        sw.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
                Log.v(getClass().getName(), "onCheckedChanged() (" + groupPosition + ", " + childPosition + ")");
            }
        });
        return row;
    }

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

我的两个模特课。父:

public class Parent {
    private String name;
    private List<Child> childList = new ArrayList<>();

    public Parent(final String name, List<Child> childList) {
        this.name = name;
        this.childList = childList;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public List<Child> getChildList() {
        return childList;
    }

    public void setChildList(final List<Child> childList) {
        this.childList = childList;
    }
}

子:

public class Child {
    private String name;

    public Child(final String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }
}

现在我在运行活动时发现以下问题。请关注:

  1. 扩展所有家长(从FIRST到FORTH)
  2. 点击从父级SECOND和FORTH(从上到下)切换ONE和TWO
  3. 未扩展所有父母(从FIRST到FORTH)
  4. 未扩展所有父母(从FIRST到FORTH)
  5. 观察:

    • 第二个父级:仅选择一个和两个
    • 第三个父母:选择了一个,两个和三个
    • 第三位父母:只选择了两位

    这里出了什么问题?同时实现ViewHolder模式在这里不起作用。

1 个答案:

答案 0 :(得分:0)

我不得不做两件事:

  1. 用状态扩展孩子并跟踪它
  2. 摆脱getChildView()getGroupView
  3. 中的if-Statements

    我的新儿童班现在是:

    public class Child {
        private String name;
        private boolean state;
    
        public Child(final String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(final String name) {
            this.name = name;
        }
    
        public boolean isState() {
            return state;
        }
    
        public void setState(final boolean state) {
            this.state = state;
        }
    }
    

    我的新getChildView()方法:

    @Override
    public View getChildView(final int groupPosition, final int childPosition, final boolean isLastChild, final View convertView, final ViewGroup parent) {
        View view = layoutInflater.inflate(R.layout.child_row, parent, false);
    
        final Switch sw = (Switch) view.findViewById(R.id.sw);
        TextView textViewChildName = (TextView) view.findViewById(R.id.childname);
    
    
        String name = ((Child) getChild(groupPosition, childPosition)).getName();
    
        sw.setChecked(list.get(groupPosition).getChildList().get(childPosition).isState());
    
        textViewChildName.setText(name);
    
        sw.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
                list.get(groupPosition).getChildList().get(childPosition).setState(isChecked);
                sw.setChecked(isChecked);
            }
        });
    
        return view;
    }
    

    最后getGroupView()

    @Override
    public View getGroupView(final int groupPosition, final boolean isExpanded, final View convertView, final ViewGroup parent) {
        View view = layoutInflater.inflate(R.layout.group_row, parent, false);
        TextView textView = (TextView) view.findViewById(R.id.groupname);
    
        String name = ((Parent) getGroup(groupPosition)).getName();
        textView.setText(name);
    
        return view;
    }
    

    我不得不退出ViewHolder模式。它对我不起作用,因为我正在使用开关并希望保持状态。