如何为自定义ExpandableListView调用notifyDataSetChanged?

4

我正在尝试为我的自定义ExpandableListView调用notifyDataSetChanged。当我的子列表被点击时,它会显示所选文件夹(组列表)中的文件。当子项被点击后,它将询问是否删除文件。然后,在删除后,ExpandableList将“刷新”。但是,不知何故,我无法调用notifyDataSetChanged方法。

我的自定义适配器:

public class customListAdapter extends BaseExpandableListAdapter {
    // Sample data set.  children[i] contains the children (String[]) for groups[i].
    private File mapFolder = new File (Environment.getExternalStorageDirectory(),"/MLT/A");
    private File recordFolder = new File (Environment.getExternalStorageDirectory(),"/MLT/B");
    private File scribbleFolder = new File (Environment.getExternalStorageDirectory(),"/MLT/C");
    private String[] groups = { "A", "B", "C" };
    private String[][] children = { mapFolder.list(), recordFolder.list(), scribbleFolder.list() };

    public Object getChild(int groupPosition, int childPosition) {
        return children[groupPosition][childPosition];
    }

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

    public int getChildrenCount(int groupPosition) {
        return children[groupPosition].length;
    }

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

        TextView textView = new TextView(MLT_File.this);
        textView.setBackgroundColor(Color.BLACK);
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        textView.setPadding(100, 5, 0, 5);
        textView.setTextColor(Color.WHITE);
        textView.setTextSize(23);
        textView.setId(1000);

        textView.setText(getChild(groupPosition, childPosition).toString());
        return textView;
    }//getChildView

    public Object getGroup(int groupPosition) {
        return groups[groupPosition];
    }

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

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

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
            ViewGroup parent) {
        TextView textView = new TextView(MLT_File.this);
        textView.setBackgroundColor(Color.WHITE);
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        textView.setPadding(100, 0, 0, 0);
        textView.setTextColor(Color.BLACK);
        textView.setTextSize(25);
        textView.setText(getGroup(groupPosition).toString());

        return textView;
    }

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

    public boolean hasStableIds() {
        return true;
    }

    public void notifyDataSetChanged() {
        this.notifyDataSetChanged();
    }

}//customListAdapter

我的onCreate:

// Set up our adapter
    listAdapter = new customListAdapter();

    expLV = (ExpandableListView) findViewById(R.id.mlt_expList);
    expLV.setAdapter(listAdapter);
    //registerForContextMenu(expLV);

    expLV.setOnChildClickListener(new OnChildClickListener()
    {
        @Override
        public boolean onChildClick(ExpandableListView parent, View v,
                int groupPosition, int childPosition, long id) 
        {
            // TODO Auto-generated method stub
            String parentName = "";
            if (groupPosition == 0)
            {
                parentName = "A";
            }

            else if (groupPosition == 1)
            {
                parentName = "B";
            }

            else if (groupPosition == 2)
            {
                parentName = "C";
            }

            TextView childView = (TextView) v;
            String childName = childView.getText().toString();

            File file = new File(Environment.getExternalStorageDirectory(),"/Folder/"+childName);
            file.delete();

            return false;
        }
    });//OnChildClickListener

在我的自定义ExpandableList中,我尝试使用notifyDataSetChanged()方法,因为意识到ExpandableList并没有这个方法。但是,当我按下expLV.n时,我创建的方法仍然没有出现...

3个回答

5
实际上,BaseExpandableListAdapter上有一个notifyDataSetChanged()函数

你所做的无益于:

 public void notifyDataSetChanged() {
    this.notifyDataSetChanged();
}

请删除它。

在您更改数据集后,在OnItemClickListener中的onClick(View v)中调用adapter.notifyDataSetChanged()


2
但是我调用的是onChildClickListener()而不是onItemClickListener。我不确定出了什么问题,但我只能调用adapter.notifyDataSetChanged。只有notify和notifyall。 - starvi
你在哪里声明了你的适配器?它是一个类变量吗?请发布你的onClick方法... - Rotemmiz
我使用了你的代码 public void notifyDataSetChanged(){ this.notifyDataSetChanged(); },但是出现了stackoverflowerror错误,有什么想法吗? - HeartlessArchangel

0

我知道这已经过时了,但对于那些仍然遇到此问题的人,您可以使用invalidateViews()方法来解决,该方法适用于ExpandableListeView,如此处所述。


-1

嗯...因为没有人告诉我该怎么做,所以我想到了一种可能有些愚蠢但很有用的方法。

我的做法是在onResume()中创建它,而不是在onCreate()中创建。当我对它进行任何更改时,它将被重新创建。这样做的原因是因为我正在使用TabMenu,当我在它们之间切换时,该类不会再次创建,从而导致列表处于相同的状态。

通过使用onResume,也简化了我的工作,因为当我想要刷新它时,我只需要调用onResume()即可。

希望这能帮助其他人。=)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接