[Android]ListView中PopupWindow的使用

懒得打字了,直接把这个类的代码贴上来

public class MainActivity extends Activity {

    private TextView tv_shuju;
    private ListView listView;
    private ArrayAdapter<String> adapter;
    static String projectfilepath = "//sdcard//麻城市宅基地资料//";
    private String[] listParents;
    private PopupWindow popupWindow;
    private ArrayList<String> folder;
    private String path;

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 判断sd卡是否存在
        boolean sdCardExist = Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED);
        // 获得sd卡根目录
        if (sdCardExist) {
            File dir = Environment.getExternalStorageDirectory();
            path = dir.getAbsolutePath() + "/麻城市宅基地资料/";
            // 文件夹List集合
            folder = getFolder(path);
            // 适配器数据
            listParents = listParent(folder);
        } else {
            Toast.makeText(getApplicationContext(), "没有SD卡", 0).show();
        }

        // 获取控件ID
        tv_shuju = (TextView) findViewById(R.id.tv_shuju);
        tv_shuju.setText("点击下面修改数据");
        listView = (ListView) findViewById(R.id.listView1);
        if (listParents.length == 0) {
            tv_shuju.setText("没有数据");
        }
        // listview适配器
        if (adapter == null) {
            adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listParents);
            listView.setAdapter(adapter);
        } else {
            adapter.notifyDataSetChanged();
        }

        // listview 点击监听
        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {

                System.out.println(position);
                if (popupWindow != null) {
                    popupWindow.dismiss();
                    popupWindow = null;
                }
                int[] location = new int[2];
                view.getLocationInWindow(location); // 获取到了x 和y的坐标 存放到了 2个元素的数组中
                int x = location[0];
                int y = location[1];
                // 弹出popupWindow
                View popup_view = View.inflate(getApplicationContext(), R.layout.popup_soft_manager, null);
                Button btn_del = (Button) popup_view.findViewById(R.id.btn_del);
                // 删除按钮
                btn_del.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        // 获取到点击的文件夹名称
                        String name = listParents[position];
                        // 删除文件夹
                        delFolder(name);
                        popupWindow.dismiss();
                        popupWindow = null;
                        shuaxin();
                    }

                });
                // 更新/重命名按钮
                Button btn_update = (Button) popup_view.findViewById(R.id.btn_update);
                btn_update.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        Intent intent = new Intent(getApplicationContext(), UpdateActivty.class);
                        intent.putExtra("floerName", folder.get(position));
                        intent.putExtra("path", path);
                        startActivityForResult(intent, 1);
                        popupWindow.dismiss();
                        popupWindow = null;

                    }
                });

                // 取消按钮
                Button btn_canel = (Button) popup_view.findViewById(R.id.btn_canel);
                btn_canel.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        popupWindow.dismiss();
                        popupWindow = null;

                    }
                });
                popupWindow = new PopupWindow(popup_view, -2, -2);
                // 给popupWindow设置背景
                popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                // 展示popupWindow 参数 1 挂载的父窗体
                popupWindow.showAtLocation(parent, Gravity.LEFT | Gravity.TOP, x + 50, y + 60);
            }

        });

        // listview 滑动监听
        listView.setOnScrollListener(new OnScrollListener() {

            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // TODO Auto-generated method stub

            }

            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                    int totalItemCount) {
                if (popupWindow != null) {
                    popupWindow.dismiss();
                    popupWindow = null;
                }

            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==2){
            shuaxin();
        }
    }

    // 刷新适配器
    private void shuaxin() {
        folder.clear();
        listParents = null;
        folder = getFolder(path);
        // 适配器数据
        listParents = listParent(folder);
        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,
                listParents);
        listView.setAdapter(adapter);

    }

    //重命名文件
    public  void renameFloder(String name,String reName){
        File file = new File(path + name);
        file.renameTo(new File(reName));
    }

    // List转换为String[]
    public String[] listParent(ArrayList<String> list) {
        int size = list.size();
        String[] array = new String[size];
        for (int i = 0; i < list.size(); i++) {
            array[i] = (String) list.get(i);
        }
        return array;
    }

    // 删除文件夹
    public void delFolder(String name) {
        File file = new File(path + name);
        if (file.isFile()) {
            file.delete();
            return;
        }
        if (file.isDirectory()) {
            File[] chaFiles = file.listFiles();
            if (chaFiles == null || chaFiles.length == 0) {
                file.delete();
                return;
            }
            for (int i = 0; i < chaFiles.length; i++) {
                chaFiles[i].delete();
            }
            file.delete();
        }

    }

    // 检查文件夹是否存在
    boolean isFolderExists(String strFolder) {
        File file = new File(strFolder);
        return file.exists();
    }

    // 扫描文件夹目录下的文件夹名字
    public ArrayList<String> getFolder(String path) {
        ArrayList<String> names = new ArrayList<String>();
        File file = new File(path);
        if (file.isDirectory()) {
            File[] array = file.listFiles();
            for (int i = 0; i < array.length; i++) {
                File f = array[i];
                names.add(f.getName());
                System.out.println("文件夹名称" + f.getName());
            }
        }
        return names;

    }

    // 扫描文件夹里面的数据
    public ArrayList<String> folderScan(String path) {
        File file = new File(path);
        ArrayList<String> names = new ArrayList<String>();
        if (file.isDirectory()) {
            File[] array = file.listFiles();

            for (int i = 0; i < array.length; i++) {
                File f = array[i];

                if (f.isFile()) {// FILE TYPE
                    String name = f.getName();
                    if (name.contains(".jpg")) {
                        names.add(name);
                        fileScan(f.getAbsolutePath());
                    }
                } else {// FOLDER TYPE
                    folderScan(f.getAbsolutePath());
                }
            }
        }
        return names;
    }

    // 扫描
    public void fileScan(String file) {
        Uri data = Uri.parse("file://" + file);
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));
    }

    protected void onDestroy() {
        // 避免窗体泄露
        if (popupWindow != null) {
            popupWindow.dismiss();
            popupWindow = null;
        }
        super.onDestroy();
    }
}
时间: 2024-10-08 06:36:51

[Android]ListView中PopupWindow的使用的相关文章

android ListView中CheckBox错位的解决

貌似已经很晚了,但是还是想记下笔记,想让今天完满. 在ListView中加了checkBox,可是发现点击改变其选中状态的时候,发现其位置错乱.状态改变的并不是你选中的,百思不得其解.后面通过上网查资料,可是个说纷纭,但是我还是找到了解决办法. 在自定义的适配器中,对checkBox的设置如下: 记住两者的顺序,先对checkBox进行事件监听,再设置其状态.前提在布局中对checkBox的状态设为false. android ListView中CheckBox错位的解决,布布扣,bubuko.

android listview中item通过viewpager实现

android listview中item通过viewpager实现 android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能.本项目主要介绍多个viewpager加载图片和listview 上下滑动不卡顿问题.本项目由作者Flyco分享的分享地址:https://github.com/H07000223/FlycoBanner_Master.本项目找对应id封装一个ViewFindUtils类,通过如下代码找id    /**

Android ListView 中的onItemClick方法中Intent 无法跳转的解决方案

I found this somewhere after googling There will be case that your custom list item doesn’t respond when you click…so what’s the reason and what’s the solution? Here several problems and solutions: 1. Scenario: list item layout contains CheckBox Prob

Android ListView中 每一项都有不同的布局

实现代码 Adapter的代码 其中:ViewHolder分别是三个不同的布局,也就是ListView中每一项的布局 TYPE_1...是三种类型. 在使用不同布局的时候,getItemViewType和getViewType不能少,一般是不用这两个函数的重载的 class RunRankAdapter extends BaseAdapter { ArrayList<HashMap<String, Object>> ls; Context mContext; LinearLayou

Android listview中使用button解决方法

其实很多东西不是粘贴代码就能解决的,做任何事都要用心做,这样才能晚上睡觉睡得比较踏实. 当你粘贴别人的代码,有时候出bug真的很烦,可是当你明白点原理的时候,能看出问题的实质,解决起来也很得心应手,开始今天的主题.当你的看到这个问题时,你应该知道问题出在哪里了,在listview中使用button(当然不只是button,还有imagebutton等自身响应点击的view),问题出现了,你会发现listview中的item不能点击了,具体是因为什么呢?大多数原因是抢焦点,button抢占了ite

Android ListView中的简单分组(标题含图片)

思路:ListView中添加一个SimpleAdapter,SimpleAdapter中动态添加大标题及大标题下的小标题,接下来按照思路来进行. 第一步:建立ListView布局文件list.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 androi

Android ListView中EditView再次焦点获取

问题:在ListView中使用EditView,当第一次将焦点给到EditView的时候弹出小键盘.使得EditView失去焦点. 分析:因为在第一次使用EditView弹出小键盘之后,会重新的调用一次getView方法.使得EditView失去焦点.当第二次点击EditView时,已经存在小键盘所以不会调用getView方法,因此也不会失去焦点. 思路:在每次点击EditView的时候,记录当前点击的View的position同时记录EditView的光标偏移位置.在下次调用getView的时

Android ListView 中加入CheckBox/RadioButton 选择状态保持、全选

最近在一个项目中,需要在ListView的item中加入CheckBox,但是遇到的一个问题是上下滑动的时候如果有选择了的CheckBox,就会出现选择项错误的问题,下面将个人的解决方法总结如下; 先说思路: 在ListView的Adapter中,用一个Map保存每一项item的选择状态,在getView方法中,设置Map中保存的某一项的选择状态就实现了状态的保存: 每一项的视图 child.xml <CheckBox        android:id="@+id/item_cb&quo

[转][Android] ListView中getView的原理+如何在ListView中放置多个item

ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能! 实际上Android为你缓存了视图. Android中有个叫做Recycler的构件,下图是他的工作原理: 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中. ListView先请求一个t