Получить список папок с подпапками определенного разрешения

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Получить список папок с подпапками определенного разрешения

Сообщение DevSergio » 29 май 2013, 17:14

Не получается получить список папок с подпапками используя фильтр разрешения .mp3.
Вот код

Код: Выделить всё

	private ListView lvFolders;
	private File file;
	private List<String> myList;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View v = inflater.inflate(R.layout.folder, null);
		lvFolders = (ListView) v.findViewById(R.id.lvFolders);

		myList = new ArrayList<String>();

		String root_sd = Environment.getExternalStorageDirectory().toString();
		file = new File(root_sd);
		addToSongs(file);

		/*File list[] = file.listFiles();
		for (int i = 0; i < list.length; i++) {
			myList.add(list[i].getName());
		}*/

		lvFolders.setAdapter(new ArrayAdapter<String>(getActivity(),
				android.R.layout.simple_list_item_1, myList));

		lvFolders.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1,
					int position, long arg3) {
				File temp_file = new File(file, myList.get(position));

				if (!temp_file.isFile()) {
					file = new File(file, myList.get(position));
					File list[] = file.listFiles();

					myList.clear();

					for (int i = 0; i < list.length; i++) {
						myList.add(list[i].getName());
					}
					Toast.makeText(getActivity(), file.toString(),
							Toast.LENGTH_LONG).show();
					lvFolders.setAdapter(new ArrayAdapter<String>(
							getActivity(), android.R.layout.simple_list_item_1,
							myList));
				}
			}
		});

		return v;

	}

	FilenameFilter textFilter = new FilenameFilter() {
		public boolean accept(File dir, String name) {
			return (name.endsWith(".mp3"));
		}
	};

	private void addToSongs(File home) {
		for (File file : home.listFiles(textFilter)) {
			if (file.isDirectory()) {
				addToSongs(file);
			} else {
				myList.add(file.getName());
			}
		}
	}

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Получить список папок с подпапками определенного разреше

Сообщение Foenix » 30 май 2013, 18:30

решилась проблема?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Получить список папок с подпапками определенного разреше

Сообщение DevSergio » 31 май 2013, 08:36

неа , писал еще на стеке там тоже никто не смог помочь

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Получить список папок с подпапками определенного разреше

Сообщение Foenix » 31 май 2013, 08:49

скорее всего, посчитали вопрос элементарным
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Получить список папок с подпапками определенного разреше

Сообщение klblk » 31 май 2013, 09:50

Вообщем, лень мне разбирать чужой код) потому скопипастю свой:
[syntax=java] String currentpath = "/";
DirectoryItemAdapter adapter;
private String ext = ".mp3";

protected void showDir(String path) {
File dir = new File(path);

adapter.clear();

File[] files = dir.listFiles();

if (files != null)
{
for (File f : files)
if (f.isDirectory())
adapter.add(f);
}

FilenameFilter fnf = new FilenameFilter() {

public boolean accept(File dir, String filename) {
return filename.endsWith(ext);
}
};


File[] filteredFiles = dir.listFiles(fnf);
if (filteredFiles != null)
{
for (File f : filteredFiles)
if (!f.isDirectory())
adapter.add(f);
}

adapter.sort(new Comparator<File>() {

public int compare(File a, File b) {
if (a.isDirectory() == b.isDirectory())
return a.getName().toLowerCase().compareTo(b.getName().toLowerCase());
else
return a.isDirectory() ? -1 : 1;
}
});

if (dir.getParentFile() != null)
adapter.insert(new File(".."), 0);

adapter.notifyDataSetChanged();

currentpath = path;
}[/syntax]

итемсликлиснер:
[syntax=java]lv.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> a, View view, int position,
long arg3) {

File f = adapter.getItem(position);
selectedFile = f;

if (f.getName().equals(".."))
showDir((new File(currentpath)).getParentFile().getPath());
else if (f.isDirectory())
showDir(f.getPath());
else
{
//ваши действия над файлом
}
}
});[/syntax]

DirectoryItemAdapter наследуется от ArrayAdapter<File>

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Получить список папок с подпапками определенного разреше

Сообщение DevSergio » 31 май 2013, 13:12

А реализацию адаптера можешь написать и как делаешь setAdapter? :)

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Получить список папок с подпапками определенного разреше

Сообщение DevSergio » 31 май 2013, 13:42

А то у меня крешится приложение

Код: Выделить всё

rivate ListView lvFolders;
	private File file;
	private List<File> myList;

	String currentpath = Environment.getExternalStorageDirectory().toString();
	DirectoryItemAdapter adapter;
	private String ext = ".mp3";

	protected void showDir(String path) {
		File dir = new File(path);

		// adapter.clear();

		File[] files = dir.listFiles();

		if (files != null) {
			for (File f : files)
				if (f.isDirectory()) {
					Log.d("Files", f.getName());
					adapter.add(f.getName());
				}
		}

		FilenameFilter fnf = new FilenameFilter() {

			public boolean accept(File dir, String filename) {
				return filename.endsWith(ext);
			}
		};

		File[] filteredFiles = dir.listFiles(fnf);
		if (filteredFiles != null) {
			for (File f : filteredFiles)
				if (!f.isDirectory())
					adapter.add(f);
		}

		adapter.sort(new Comparator<File>() {

			public int compare(File a, File b) {
				if (a.isDirectory() == b.isDirectory())
					return a.getName().toLowerCase()
							.compareTo(b.getName().toLowerCase());
				else
					return a.isDirectory() ? -1 : 1;
			}
		});

		if (dir.getParentFile() != null)
			adapter.insert(new File(".."), 0);

		adapter.notifyDataSetChanged();

		currentpath = path;
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View v = inflater.inflate(R.layout.folder, null);
		lvFolders = (ListView) v.findViewById(R.id.lvFolders);

		myList = new ArrayList<File>();

		file = new File(currentpath);

		showDir(currentpath);

		lvFolders.setAdapter(new DirectoryItemAdapter(getActivity(),
				android.R.layout.simple_list_item_1, myList));

		lvFolders.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1,
					int position, long arg3) {
				lvFolders.setOnItemClickListener(new OnItemClickListener() {

					public void onItemClick(AdapterView<?> a, View view,
							int position, long arg3) {

						File f = adapter.getItem(position);
						// selectedFile = f;

						if (f.getName().equals(".."))
							showDir((new File(currentpath)).getParentFile()
									.getPath());
						else if (f.isDirectory())
							showDir(f.getPath());
						else {
							// ваши действия над файлом
						}
					}
				});
			}
		});

		return v;

	}

Код: Выделить всё

import java.io.File;
import java.util.List;

import android.content.Context;
import android.widget.ArrayAdapter;

public class DirectoryItemAdapter extends ArrayAdapter<File> {

	public DirectoryItemAdapter(Context context, int textViewResourceId,
			List<File> objects) {
		super(context, textViewResourceId, objects);
	}

	public void add(String name) {

	}

}


Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Получить список папок с подпапками определенного разреше

Сообщение klblk » 31 май 2013, 14:59

И я должен угадать где оно крешится?

это в onCre
[syntax=java]adapter = new DirectoryItemAdapter(this, R.layout.directory_item, new ArrayList<File>());

ListView lv = (ListView) findViewById(R.id.directory_list);
lv.setAdapter(adapter);
lv.setOnItemClickListener
//..............
showDir(currentpath);[/syntax]

Адаптер:
[syntax=java]class DirectoryItemAdapter extends ArrayAdapter<File>
{
final Context context;
private int secColor;
private int primColor;

public DirectoryItemAdapter(Context context, int textViewResourceId, ArrayList<File> items)
{
super(context, textViewResourceId, items);
this.context = context;

TypedArray array = context.getTheme().obtainStyledAttributes(new int[] {
android.R.attr.textColorSecondary,
android.R.attr.textColorPrimary,
});

secColor = array.getColor(0, 0xa0a0a0);
primColor = array.getColor(1, 0xFFFFFF);
array.recycle();
}


@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
if (v == null)
{
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.directory_item, null);
}

File di = getItem(position);

if (di != null)
{
TextView filename = (TextView) v.findViewById(R.id.filename);
TextView size = (TextView) v.findViewById(R.id.size);

{
String tmp = di.getName();
if (tmp.startsWith("/"))// skip one
tmp = tmp.substring(1);
filename.setText(di.getName());
}

if (di.isDirectory())
{
filename.setTextColor(primColor);
filename.setTypeface(Typeface.DEFAULT_BOLD);
size.setText("");
}
else
{
filename.setTextColor(secColor);
filename.setTypeface(Typeface.DEFAULT);
size.setText(SizeAppearance.valueByLimit(di.length(), 4).toString());
}
}

return v;
}
}[/syntax]
Последний раз редактировалось klblk 01 июн 2013, 05:24, всего редактировалось 1 раз.

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Получить список папок с подпапками определенного разреше

Сообщение DevSergio » 31 май 2013, 20:08

хм , заработало но оно вовзвращает все папки на карте
http://i060.radikal.ru/1305/1f/afa064c236a2.jpg

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Получить список папок с подпапками определенного разреше

Сообщение klblk » 01 июн 2013, 05:21

DevSergio писал(а):хм , заработало но оно возвращает все папки на карте
http://i060.radikal.ru/1305/1f/afa064c236a2.jpg
хм, то есть тебе нужно, чтобы отображались только те папки где есть mp3?
Значит я не правильно понял тебя. Подумал, что тебе нужно организовать навигацию по каталогам с возможностью выбрать mp3 файлы.

тогда для каталогов нужно добавить логику. Скорее всего нужна будет рекурсивная функция. Что-то вроде:
Натыкаемся на каталог->отправляем его в нашу boolean функцию()->там получаем файл лист->ищем mp3->если находим возвращаем true, если нет и вложенных каталогов нет, то возвращаем false, иначе проверяем каталоги из полученого листа, т.е. запихиваем их в нашу boolean функцию() -> если от любого каталога пришёл true, то возвращаем true, если из всех каталогов пришёл false, то соответственно false.
ну и исходя из результата решаем добавлять папку в лист или нет.

как-то так.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Получить список папок с подпапками определенного разреше

Сообщение Foenix » 01 июн 2013, 09:01

klblk писал(а):
DevSergio писал(а):хм , заработало но оно возвращает все папки на карте
http://i060.radikal.ru/1305/1f/afa064c236a2.jpg
хм, то есть тебе нужно, чтобы отображались только те папки где есть mp3?
Я извиняюсь, но если это действительно так, то не советую так делать. Посмотрите любой диалог выбора файла (например, фильма) - там есть фильтр, иногда даже жестко зафиксированный, и если данных файлов нет в папке, то она отображается пустой. Нельзя просто так скрывать папки (кроме каких-то системных), пользователь можно сильно удивиться, мягко говоря. :o
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Получить список папок с подпапками определенного разреше

Сообщение DevSergio » 01 июн 2013, 09:34

Ну вот посмотри в PlayerPro там есть вкладка папки , хочу сделать аналогичное. Вообще думал что через MediaStore можно такое будет сделать , но что-то не нашел.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Получить список папок с подпапками определенного разреше

Сообщение klblk » 01 июн 2013, 13:36

Вообще та логика, которую я описал в своём сообщении выше, очень затратна в плане процессорного времени... если у тебя на сд карте скажем пару миллионов файлов, то проверяться они будут долго... что не приемлемо для пользователя.

Можно попробывать при старте приложения делать поиск файлов на карте и сохранять все найденные файлы в список (в тотже ArrayList например), и уже потом исходя из этого списка строить ListView. То есть чтобы поиск выполнялся всего 1 раз. Проблем в этом случае в том что список динамически обновляться не будет (допустим если мы удалим файл с сд карты он по прежнему будет в списке приложения). Можно добавить кнопочку обновить список или автоматически его периодически обновлять в фоновом потоке. Но боюсь тогда моя реализация по большей части не подойдет.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Получить список папок с подпапками определенного разреше

Сообщение Foenix » 01 июн 2013, 13:40

klblk, совершенно верно, так многие программы по отображению картинок или другой мультимедиа себя ведут. Обновляют списки они периодически или частями (например, если пользователь какую-то папочку захотел открыть)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить