0

我的 android 应用程序中有一个列表视图,它对列表视图本身执行两个功能。

拳头,我可以从列表视图中删除一个项目。

其次,我可以重命名列表视图中的某些内容。

任何时候出现上述情况,

如果列表视图上的最后一项被删除,我如何显示不同的 XML 布局?

adapter = new SetRowsCustomAdapter(getActivity(), R.layout.customlist, rowsArray);
dataList = (ListView) mFrame3.findViewById(R.id.lvFiles); //lvfiles from xml layout
dataList.setAdapter(adapter);
dataList.setEmptyView(noFilesDisplayed); //not working

其次,一旦我重命名列表视图中的任何内容,如何更新列表视图以反映更改?

adapter.notifyDataSetChanged(); //not working

我的 ContextMenu 中有两个选择,DeleteRename

如果选择删除,则执行以下代码:

if (menuItemIndex == 0) {
    if (folder.exists()) {
        //File flEachFile = new File(folder.toString() + "/" + currentFileName + ".tp");
        flEachFile = new File(folder.toString() + "/" + txt + ".tp");
        flEachFile2 = new File(folder.toString() + "/." + txt + ".tp");
        if (flEachFile.exists()) {
            flEachFile.delete();
        }
        if (flEachFile2.exists()) {
            flEachFile2.delete();
        }
        adapter.remove(adapter.getItem(info.position)); //updated the list
        //adapter.notifyDataSetChanged();
        dataList.invalidate();
        dataList.setEmptyView(noFilesDisplayed);//should display the noFilesDisplayed layout but it's not.
        //getActivity().getActionBar().setSelectedNavigationItem(1);
    }
}

这可以正常工作,因为在我删除列表时列表会自行更新。因此,如果我在视图中有两个列表并且我删除了一个列表更新以显示一个:

adapter.remove(adapter.getItem(info.position)); //updated the list

但是,如果我删除列表中的最后一项并且我想显示另一个 xml 布局,如下所示:

dataList.setEmptyView(noFilesDisplayed);//should display the noFilesDisplayed layout but it's not.

它不起作用。

==================================================== ====

如果选择重命名,则执行以下代码:

if (menuItemIndex == 1) {
            // custom dialog
            final Dialog dialog = new Dialog(getActivity());
            dialog.setContentView(R.layout.renamefile);
            dialog.setTitle("Rename Existing Trip");

            currTrip = (TextView) dialog.findViewById(R.id.tvCurrentFileName);
            currTrip.setText(txt);

            etRT = (EditText) dialog.findViewById(R.id.etRenameTo);
            Button btnCancel = (Button) dialog.findViewById(R.id.btnCancel);
            Button btnApply = (Button) dialog.findViewById(R.id.btnApply);
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

            btnApply.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    if(folder.exists()) {
                        flEachFile = new File(folder.toString() + "/" + currTrip.getText().toString() + ".tp");
                        flEachFile2 = new File(folder.toString() + "/." + currTrip.getText().toString() + ".tp");
                        if (flEachFile.exists()) {
                            if (etRT.getText().toString().matches("")) {
                                rTo = (TextView) dialog.findViewById(R.id.tvRenameTo);
                                rTo.setTextColor(Color.parseColor("#A60000"));
                            }
                            else {
                                File toFile = new File(folder.toString() + "/" + etRT.getText().toString() + ".tp");
                                flEachFile.renameTo(toFile);
                                if (flEachFile2.exists()) {
                                    File toFile2 = new File(folder.toString() + "/." + etRT.getText().toString() + ".tp");
                                    flEachFile2.renameTo(toFile2);
                                }
                                //adapter.notifyDataSetChanged();
                                dataList.invalidate();
                                dialog.dismiss();
                                //getActivity().getActionBar().setSelectedNavigationItem(1);
                            }
                        }
                        else {
                            Toast.makeText(getActivity(), "File does not exist", Toast.LENGTH_SHORT).show();
                        }
                    }

                }
            });
            // if cancel is clicked, close the custom dialog
            btnCancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
            dialog.show();
        }

如果我切换选项卡并返回此选项卡,我只能看到更改。

4

2 回答 2

1

最好ListView通过其关联的适配器与 a 进行交互,在这种情况下是您的SetRowCustomAdapter. 要删除您应该执行的项目adapter.remove(position),它将自动处理该notifyDataSetChanged()函数并在内部将其从它所在的任何数据结构中删除。至于重命名某些内容,这取决于您如何在适配器中对幕后数据进行建模。您能否为您的客户适配器提供更多代码?你在内部使用数组吗?

更新

关于setEmptyView(noFilesDisplayed)不工作,是否noFilesDisplayed在相同的布局层次结构中ListView?根据我的经验,也被其他人验证过,空视图(在这种情况下noFilesDisplayed)必须在同一个布局 XML 文件中,更具体地说,必须在同一个层次结构中。我个人不知道为什么必须这样,但似乎这是它工作的唯一方式。这是我的意思的例子......

<ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

<View
    android:id="@+id/empty_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:visibility="gone" />

然后在代码中,您可以指向noFilesDisplayed资源 ID empty_view。我不完全确定是否gone有必要将可见性设置为,请尝试使用它。我希望这能回答你关于空视图的问题。

于 2013-08-11T04:01:51.897 回答
1

adpater.notifyDataSetChanged();在您对 ListView 进行更改后调用,如果notifyDataChanged()仍然无法正常工作,您可以设置适配器并将新更新的数据传递给onResume方法中的适配器构造函数。因此,每当您在 listView 中删除/重命名数据时,它都会自动更新。(仅当您开始一个新的活动以删除或重命名 listView 项目时,第二种方法才有效。)

@Override
protected void onResume() {
    super.onResume();

       SetRowsCustomAdapter adapter = new SetRowsCustomAdapter(getActivity(), R.layout.customlist, rowsArray);
       dataList.setAdapter(adapter);
 }
于 2013-08-11T04:34:39.763 回答