簡體   English   中英

Android ListView-當數組是本地文件時,如何刷新ListView?

[英]Android ListView - How to refresh ListView when array is local files?

我需要一些幫助,我有一個列表視圖應用程序。 在列表視圖中,它將加載本地文件(從特定文件夾)。 現在我面臨的問題是,當我刪除文件或應用程序創建新文件時,它沒有刷新。 新文件應自動添加到列表中,而刪除的文件應從列表中移出,但它根本不會更新。 請幫我!

問題更新:因此,我在notifydatasetchanged()面臨的主要問題notifydatasetchanged()observer方法非常准確,沒有任何問題!

注意:這是100%的可能性,如果不能,那么文件管理器應用程序如何刷新其列表視圖?

setContentView(R.layout.activity_list_view);
        File appDir = new File( Environment.getExternalStorageDirectory() + "/App folder" );
        File filesDir = new File( appDir + "/Files" );
        if ( !appDir.exists()) {
            appDir.mkdir();
        }

        if ( !filesDir.exists()) {
            filesDir.mkdir();
        }

        File dir = new File(String.valueOf(filesDir));
        final File[] filelist = dir.listFiles();
        final String[] getFiles = new String[filelist.length];
        for (int i = 0; i < getFiles.length; i++) {
            getFiles[i] = filelist[i].getName();
        }

        lv = (ListView) findViewById(R.id.listView);
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, getFiles);
        lv.setAdapter(adapter);

        @SuppressLint("HandlerLeak") final Handler handler = new Handler() {
            @Override
            public void handleMessage(android.os.Message msg) {
                //to keep refreshing the list view
                adapter.notifyDataSetChanged();
            }
        };
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0);
            }
        };
        timer.schedule(task, 1000, 500);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
}

您實際上需要更新適配器中的數據。 ArrayAdapter具有列表add()remove()等方法。您可能希望刪除並重新添加所有數據(如果發生在應用程序外部),但是當然這可能會降低性能。

您可以為特定的路徑目錄注冊FileObserver ,當該目錄中發生任何更改時,它將通知並可以刷新列表。

 FileObserver observer;
 List<String> fileList;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_list_view);

        fileList=new ArrayList<>();
        lv = (ListView) findViewById(R.id.listView);
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, fileList);
        lv.setAdapter(adapter);

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
          }


        loadDataFromPath();


        @SuppressLint("HandlerLeak") final Handler handler = new Handler() {
            @Override
            public void handleMessage(android.os.Message msg) {
                //to keep refreshing the list view
                adapter.notifyDataSetChanged();
            }
        };
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0);
            }
        };
        timer.schedule(task, 1000, 500);

        File appDir = new File( Environment.getExternalStorageDirectory() + "/App folder" );
        File filesDir = new File( appDir + "/Files" );
      observer = initSingleDirectoryObserver(file.getAbsolutePath());
observer.startWatching();

}

 @Override
    public void onDestroy() {
    observer.stopWatching();
     super.onDestroy();
    }

public void loadDataFromPath()
{
 File appDir = new File( Environment.getExternalStorageDirectory() + "/App folder" );
        File filesDir = new File( appDir + "/Files" );
        if ( !appDir.exists()) {
            appDir.mkdir();
        }

        if ( !filesDir.exists()) {
            filesDir.mkdir();
        }

        File dir = new File(String.valueOf(filesDir));
        final File[] filelist = dir.listFiles();

        fileList.clear();
        for (int i = 0; i < getFiles.length; i++) {
           fileList.add(filelist[i].getName());
        }

         adapter.notifyDataSetChanged();



}

private FileObserver initSingleDirectoryObserver(String directoryPath) {
FileObserver observer = new FileObserver(directoryPath) {
            @Override 
            public void onEvent(int event, String file) {
                String filePath = dirPath + "/" + file;
                if (event == FileObserver.CREATE) {
                    loadDataFromPath();
                }else if (event == FileObserver.DELETE) {
                    loadDataFromPath();
                } 
            } 
        }; 
        return observer;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM