Android ListAdapter notifyDataSetChanged不';添加自定义适配器时无法工作

Android ListAdapter notifyDataSetChanged不';添加自定义适配器时无法工作,android,android-listview,listadapter,Android,Android Listview,Listadapter,在onCreate上,我使用这个 AlertDialog.Builder dialogBuilder = createDirectoryChooserDialog(title, m_subdirs, new DirectoryOnClickListener()); private void updateDirectory() { m_subdirs.clear(); m_subdirs.addAll(getDirectories(m_dir)); m_titleVi

在onCreate上,我使用这个

AlertDialog.Builder dialogBuilder = createDirectoryChooserDialog(title, m_subdirs, new DirectoryOnClickListener());
 private void updateDirectory() {

    m_subdirs.clear();
    m_subdirs.addAll(getDirectories(m_dir));
    m_titleView.setText(m_dir);

    m_listAdapter.notifyDataSetChanged();
}
这是createDirectory

private AlertDialog.Builder createDirectoryChooserDialog(String title, List<String> listItems, DialogInterface.OnClickListener onClickListener) {
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(m_context);

    // Create custom view for AlertDialog title containing
    // current directory TextView and possible 'New folder' button.
    // Current directory TextView allows long directory path to be wrapped to multiple lines.
    LinearLayout titleLayout = new LinearLayout(m_context);
    titleLayout.setOrientation(LinearLayout.VERTICAL);

    m_titleView = new TextView(m_context);
    m_titleView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    m_titleView.setTextAppearance(m_context, android.R.style.TextAppearance_Large);
    // m_titleView.setTextColor(m_context.getResources().getColor(android.R.color.white));
    m_titleView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
    m_titleView.setText(title);

    titleLayout.addView(m_titleView);

    dialogBuilder.setCustomTitle(titleLayout);

    m_listAdapter = createListAdapter(listItems);

    dialogBuilder.setSingleChoiceItems(m_listAdapter, -1, onClickListener);
    dialogBuilder.setCancelable(false);

    return dialogBuilder;
}
当创建列表适配器是这样时,它不工作

  private MenuListAdapter createListAdapter(List<String> items) {
    int[] icons = new int[items.size()];
    String[] folders = new String[items.size()];
    for (int i = 0; i < items.size(); i++) {
        icons[i] = R.drawable.ic_folder;
        folders[i] = items.get(i);
    }
    return new MenuListAdapter(m_context, folders, icons);
}
}
谁能告诉我有什么区别吗?我做错了什么?

您提交给自定义适配器的数据集与您在
updateDirectory()
中修改的数据集不同。按照您编写它的方式,您可以做的最简单的事情就是通过以下方式修改更新目录:

private void updateDirectory() {
   m_subdirs.clear();
   m_subdirs.addAll(getDirectories(m_dir));
   m_titleView.setText(m_dir);
   dialogBuilder.setSingleChoiceItems(createListAdapter(m_subdirs), -1, onClickListener);

}

问题是您没有修改存储在MenuAdapter中的数据。要解决此问题,可以在适配器中创建更新方法,并在用户单击时调用该方法:

private void updateDirectory() {
    m_titleView.setText(m_dir);
    m_listAdapter.updateList(getDirectories(m_dir));
}

在MenuListAdapter中,添加以下方法

public void updateList(List<String> newItems){
    mIcons = new int[newItems.size()];
    mTitle = new String[newItems.size()];
    for (int i = 0; i < newItems.size(); i++) {
        mIcons[i] = R.drawable.ic_folder;
        mTitle[i] = items.get(i);
    }
    notifyDataSetChanged();
}
public void updateList(列出新项){
mIcons=newint[newItems.size()];
mTitle=新字符串[newItems.size()];
对于(int i=0;i
好的,所以我管理它工作的唯一方法就是这样

我曾经参与过这件事

AlertDialog dirsDialog = dialogBuilder.create();
所以在UpdateDirectory()中我把这个

ListView list = dirsDialog.getListView();
m_listAdapter = createListAdapter(m_subdirs);
list.setAdapter(m_listAdapter);

我不认为这是最好的方法,但这是我成功的唯一方法

对我来说,它们似乎不一样。仔细看看,但是当m_listAdapter位于dialogbuilder中时,我如何设置它?将dialogbuilder保留为memeber类,并使用新适配器调用setSingleChoiceItem。如果我尝试这样做,但updatelist中没有新的int和新字符串,那么它只会使用新的元素更新数组的第一个元素。如果我试着用新的,它根本不起作用。我认为它只是失去了对米肯和麦蒂的引用。我还尝试使用ArrayList,而不是new,尝试清除它并添加新元素,但仍然不起作用:/
AlertDialog dirsDialog = dialogBuilder.create();
ListView list = dirsDialog.getListView();
m_listAdapter = createListAdapter(m_subdirs);
list.setAdapter(m_listAdapter);