[英]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.