android - 在 Android 中的 BaseAdapter 的弹出菜单中重命名 ListView 项后更新 ListView

标签 android listview android-listview android-arrayadapter popupmenu

我有一个 ListView,它有一个自定义适配器和一个 PopupMenu,它在列表项上提供了一些选项,包括重命名选项。重命名列表项后,我想刷新 ListView 并显示重命名的列表项。
以下是我的代码。

文档 fragment

public class DocumentsFragment extends Fragment{
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_my_doc, container, false);       

        ArrayList<FolderBean> folderList = new ArrayList<FolderBean>();
        fileNames = fileFunctions.listFileNames(Environment.getExternalStorageDirectory() + "/Documents/Files");

        for(int i = 0; i < fileNames.length; i++){
            folderList.add(new FolderBean(fileNames[i], "text"));
        }

        listView = (ListView) rootView.findViewById(R.id.myDocList);
        CustomFolderListAdapter cAdapter = new CustomFolderListAdapter(getActivity(), folderList);
        listView.setAdapter(cAdapter);
        listView.setOnItemClickListener(this);          
        listView.setOnItemLongClickListener(this);

        return rootView;
    }
}

自定义文件夹列表适配器

public class CustomFolderListAdapter extends BaseAdapter {

    private ArrayList<FolderBean> folderList;
    private Context context;
    private FolderBean folderBean;

    public CustomFolderListAdapter(Context applicationContext, ArrayList<FolderBean> questionForSliderMenu) {   
        super();
        this.context = applicationContext;
        this.folderList = questionForSliderMenu;    
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        folderBean = new FolderBean();
        folderBean = folderList.get(position);

        if (convertView == null) {  
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.folder_popup_item, null);
        }

        TextView fileName = (TextView) convertView.findViewById(R.id.file_name);
        ImageView fileImage = (ImageView) convertView.findViewById(R.id.file_icon);
        ImageView fileOptions = (ImageView) convertView.findViewById(R.id.file_options_icon);

        fileOptions.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (view.getId()) {
                    case R.id.file_options_icon:
                         PopupMenu popup = new PopupMenu(context, view);
                         popup.getMenuInflater().inflate(R.menu.clipboard_popup,  popup.getMenu());
                         popup.show();
                         popup.setOnMenuItemClickListener(new  PopupMenu.OnMenuItemClickListener() {
                             @Override
                             public boolean onMenuItemClick(MenuItem item) {

                                 switch (item.getItemId()) {
                                 case R.id.file_rename_menu:


                                    final String filename = folderList.get(position).getName();
                                    final String ext =   filename.substring(filename.indexOf(".") + 1);

                                    AlertDialog.Builder builderR = new AlertDialog.Builder(context);
                                    builderR.setTitle("Rename file");
                                    builderR.setCancelable(true);

                                    final EditText input = new EditText(context);
                                    input.setText(filename.substring(0, filename.indexOf(".")));
                                    builderR.setView(input);

                                    builderR.setPositiveButton("Rename", new DialogInterface.OnClickListener() {

                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            if(input.getText().toString().equals("")){
                                                UtilClass.getInstance().displayToast(context, "Please enter a name for the file", Toast.LENGTH_LONG);
                                            }
                                            else{
                                                File from = new File(Environment.getExternalStorageDirectory() + "/Documents/Files/" + filename);

                                                File to = new File(Environment.getExternalStorageDirectory() + "/Documents/Files/" + input.getText().toString() + "." + ext);

                                                boolean renamed = from.renameTo(to);

                                                if(renamed){
                                                    System.out.println("The position is " + position);
                                                    /** I have to do it here, don't I? How should I update the listview with the renamed file name?     **/                                 
                                                    notifyDataSetChanged();
                                                }                                               
                                            }
                                        }                                       
                                    });

                                    builderR.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            dialog.dismiss();
                                        }
                                    });

                                    AlertDialog alertR = builderR.create();
                                    alertR.show();

                                    break;
                                 }
                             }
                         });
                }
            }
        }

    }
}

最佳答案

您应该重新填充文件夹列表,然后调用 Notifydatasetchanged。

fileNames = fileFunctions.listFileNames(Environment.getExternalStorageDirectory() + "/Documents/Files");

    for(int i = 0; i < fileNames.length; i++){
        folderList.add(new FolderBean(fileNames[i], "text"));
    }

关于android - 在 Android 中的 BaseAdapter 的弹出菜单中重命名 ListView 项后更新 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30994532/

相关文章:

android - 减少 android studio 3.2.1 中的构建时间

java - 是什么导致 JNI 错误 "use of deleted local reference"?

java - 处理空列表 - 使用 ListFragment 或 Fragment+ListView 更好?

android - 从字符串数组填充 ListView

用于 ListView 的 Android SearchView 过滤器

android - 如何从 imageView Android 中获取位图的真实坐标(X,Y)

java - 如何解析 Location.distanceBetween 方法的结果?

android - 如何在 xml 中的 Fragment 中的 ListView 上方放置 float 操作按钮 (FAB)?

android - ViewHolder 弄乱 View

android-listview - 如何单击 ListView 特定行位置中的 View