android - 向下滚动后可扩展的 ListView Child 返回错误的 View

标签 android android-listview expandablelistview expandablelistadapter

我使用 Expandable Listview 来显示两组内容,列表总是像图 A 一样展开。 当我在我的设备上运行它时,我发现了一个问题。 当我运行时,它只显示列表的一半,如 图 B 所示,所以我向下滚动以查看列表的其余部分,但我得到的是第二组的一些 child 来自第一组,如图C

enter image description here

我已经检查了我的代码,我认为没有错误或问题。 这是我的代码

这是 Activity

public class MainActivity extends ActionBarActivity {

    ExpandableListView lv;
    ParentListAdapter listAdapter;
    List<HeaderObject> listDataHeader;
    List<OpiniObject> opini;
    List<OpiniObject> related;
    HashMap<HeaderObject, List<OpiniObject>> listDataChild;

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

        opini = new ArrayList<OpiniObject>();
        related = new ArrayList<OpiniObject>();

        lv = (ExpandableListView) findViewById(R.id.expandLV);

        prepareListData();
    }

    private void prepareListData() {

        listDataHeader = new ArrayList<HeaderObject>();
        listDataChild = new HashMap<HeaderObject, List<OpiniObject>>();

        HeaderObject itemData1 = new HeaderObject();
        itemData1.setOwner("Your Name");
        itemData1.setQuestion("Whats up");
        listDataHeader.add(itemData1);

        HeaderObject itemData2 = new HeaderObject();
        itemData2.setTitle("Related");
        listDataHeader.add(itemData2);

        opini.add(new OpiniObject("name 1","Lorem \n ipsum \n hahaha \n test \n data"));
        opini.add(new OpiniObject("name 2","content 2 \n jus \n test \n content"));
        opini.add(new OpiniObject("name 3","content 3 \n bla \n bla \n bla"));

        related.add(new OpiniObject("text 1"));
        related.add(new OpiniObject("text 2"));
        related.add(new OpiniObject("text 3"));
        related.add(new OpiniObject("text 4"));
        related.add(new OpiniObject("text 5"));
        related.add(new OpiniObject("text 6"));
        related.add(new OpiniObject("text 7"));
        related.add(new OpiniObject("text 8"));

        listDataChild.put(listDataHeader.get(0), opini); 
        listDataChild.put(listDataHeader.get(1), related);

        listAdapter = new ParentListAdapter(this, listDataHeader, listDataChild);
        lv.setAdapter(listAdapter);
    }
}

这是我的适配器

public class ParentListAdapter extends BaseExpandableListAdapter{

    private Context context;
    private List<HeaderObject> listDataHeader;
    private HashMap<HeaderObject, List<OpiniObject>> listDataChild;

    public ParentListAdapter(Context context,
            List<HeaderObject> listDataHeader,
            HashMap<HeaderObject, List<OpiniObject>> listDataChild) {
        super();
        this.context = context;
        this.listDataHeader = listDataHeader;
        this.listDataChild = listDataChild;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return this.listDataChild.get(this.listDataHeader.get(groupPosition)).get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

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

        LinearLayout container = (LinearLayout) convertView.findViewById(R.id.containerOpini);
        TextView txtListChild = (TextView) convertView.findViewById(R.id.lblListItem);
        TextView txtUser = (TextView) convertView.findViewById(R.id.lblUserOpini);
        TextView txtOpini = (TextView) convertView.findViewById(R.id.lblIsiOpini);

        OpiniObject opini = (OpiniObject) getChild(groupPosition, childPosition);
        if(groupPosition==0){
            container.setVisibility(View.VISIBLE);
            txtListChild.setVisibility(View.GONE);
            txtUser.setText(opini.getName());
            txtOpini.setText(opini.getContent());
        }else{
            txtListChild.setText(opini.getText());
            txtListChild.setTypeface(null, Typeface.BOLD);
        }
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        // TODO Auto-generated method stub
        return this.listDataChild.get(this.listDataHeader.get(groupPosition)).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        // TODO Auto-generated method stub
        return this.listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        // TODO Auto-generated method stub
        return this.listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        // TODO Auto-generated method stub
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

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

        ExpandableListView eLV = (ExpandableListView) parent;
        eLV.expandGroup(groupPosition);

        LinearLayout container = (LinearLayout) convertView.findViewById(R.id.PertanyaanHeader);
        TextView lblListHeader = (TextView) convertView.findViewById(R.id.lblListHeader);
        TextView lblOwner = (TextView) convertView.findViewById(R.id.lblUser);
        TextView lblQuestion = (TextView) convertView.findViewById(R.id.lblTanya);

        HeaderObject item = (HeaderObject) getGroup(groupPosition);

        if(groupPosition==0){
            container.setVisibility(View.VISIBLE);
            lblListHeader.setVisibility(View.GONE);
            lblOwner.setText(item.getOwner());
            lblQuestion.setText(item.getQuestion());
        }else{
            lblListHeader.setText(item.getTitle());
            lblListHeader.setTypeface(null, Typeface.BOLD);
        }

        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return true;
    }

}

谁能帮帮我?也许我错过了一些非常重要的事情?

谢谢。

最佳答案

你有这个结果是因为 android recycling mechanism .

要解决这个问题,只需更改以下代码:

if(groupPosition==0){
      container.setVisibility(View.VISIBLE);
      txtListChild.setVisibility(View.GONE);
      txtUser.setText(opini.getName());
      txtOpini.setText(opini.getContent());
}else{
      txtListChild.setText(opini.getText());
      txtListChild.setTypeface(null, Typeface.BOLD);
}

为此:

if(groupPosition==0){
      container.setVisibility(View.VISIBLE);
      txtListChild.setVisibility(View.GONE);
      txtUser.setText(opini.getName());
      txtOpini.setText(opini.getContent());
}else{
      container.setVisibility(View.GONE);      // changes here
      txtListChild.setVisibility(View.VISIBLE);// changes here
      txtListChild.setText(opini.getText());
      txtListChild.setTypeface(null, Typeface.BOLD);
}

关于android - 向下滚动后可扩展的 ListView Child 返回错误的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28211695/

相关文章:

android - 显示对话框时尝试锁定屏幕旋转

android - 更新抽屉导航 ListView

android - 可扩展 ListView GroupView 上的复选框在 android 中滚动时自动选中和取消选中

android - 应用内购买在购买后获取买家电子邮件

android - 根据屏幕尺寸强制加载所需的 dpi 绘图

android - SearchView 中的筛选文本显示未删除

android - 如何使用来自外部文件而不是来自 res/values/strings.xml 文件的数据填充 Android 中的 ListView

java - 使用 AsyncTask 用多个项目填充 ExpandableListView

android - 如何将子项动态添加到可扩展 ListView 中。?

android - 如何在 ViewPager2 中实现 Spinner