Страница 1 из 1
Получить список папок с подпапками определенного разрешения
Добавлено: 29 май 2013, 17:14
DevSergio
Не получается получить список папок с подпапками используя фильтр разрешения .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());
}
}
}
Re: Получить список папок с подпапками определенного разреше
Добавлено: 30 май 2013, 18:30
Foenix
решилась проблема?
Re: Получить список папок с подпапками определенного разреше
Добавлено: 31 май 2013, 08:36
DevSergio
неа , писал еще на стеке там тоже никто не смог помочь
Re: Получить список папок с подпапками определенного разреше
Добавлено: 31 май 2013, 08:49
Foenix
скорее всего, посчитали вопрос элементарным
Re: Получить список папок с подпапками определенного разреше
Добавлено: 31 май 2013, 09:50
klblk
Вообщем, лень мне разбирать чужой код) потому скопипастю свой:
[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>
Re: Получить список папок с подпапками определенного разреше
Добавлено: 31 май 2013, 13:12
DevSergio
А реализацию адаптера можешь написать и как делаешь setAdapter?

Re: Получить список папок с подпапками определенного разреше
Добавлено: 31 май 2013, 13:42
DevSergio
А то у меня крешится приложение
Код: Выделить всё
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) {
}
}
Re: Получить список папок с подпапками определенного разреше
Добавлено: 31 май 2013, 14:59
klblk
И я должен угадать где оно крешится?
это в 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]
Re: Получить список папок с подпапками определенного разреше
Добавлено: 31 май 2013, 20:08
DevSergio
хм , заработало но оно вовзвращает все папки на карте
http://i060.radikal.ru/1305/1f/afa064c236a2.jpg
Re: Получить список папок с подпапками определенного разреше
Добавлено: 01 июн 2013, 05:21
klblk
хм, то есть тебе нужно, чтобы отображались только те папки где есть mp3?
Значит я не правильно понял тебя. Подумал, что тебе нужно организовать навигацию по каталогам с возможностью выбрать mp3 файлы.
тогда для каталогов нужно добавить логику. Скорее всего нужна будет рекурсивная функция. Что-то вроде:
Натыкаемся на каталог->отправляем его в нашу boolean функцию()->там получаем файл лист->ищем mp3->если находим возвращаем true, если нет и вложенных каталогов нет, то возвращаем false, иначе проверяем каталоги из полученого листа, т.е. запихиваем их в нашу boolean функцию() -> если от любого каталога пришёл true, то возвращаем true, если из всех каталогов пришёл false, то соответственно false.
ну и исходя из результата решаем добавлять папку в лист или нет.
как-то так.
Re: Получить список папок с подпапками определенного разреше
Добавлено: 01 июн 2013, 09:01
Foenix
klblk писал(а):
хм, то есть тебе нужно, чтобы отображались только те папки где есть mp3?
Я извиняюсь, но если это действительно так, то не советую так делать. Посмотрите любой диалог выбора файла (например, фильма) - там есть фильтр, иногда даже жестко зафиксированный, и если данных файлов нет в папке, то она отображается пустой. Нельзя просто так скрывать папки (кроме каких-то системных), пользователь можно сильно удивиться, мягко говоря.

Re: Получить список папок с подпапками определенного разреше
Добавлено: 01 июн 2013, 09:34
DevSergio
Ну вот посмотри в PlayerPro там есть вкладка папки , хочу сделать аналогичное. Вообще думал что через MediaStore можно такое будет сделать , но что-то не нашел.
Re: Получить список папок с подпапками определенного разреше
Добавлено: 01 июн 2013, 13:36
klblk
Вообще та логика, которую я описал в своём сообщении выше, очень затратна в плане процессорного времени... если у тебя на сд карте скажем пару миллионов файлов, то проверяться они будут долго... что не приемлемо для пользователя.
Можно попробывать при старте приложения делать поиск файлов на карте и сохранять все найденные файлы в список (в тотже ArrayList например), и уже потом исходя из этого списка строить ListView. То есть чтобы поиск выполнялся всего 1 раз. Проблем в этом случае в том что список динамически обновляться не будет (допустим если мы удалим файл с сд карты он по прежнему будет в списке приложения). Можно добавить кнопочку обновить список или автоматически его периодически обновлять в фоновом потоке. Но боюсь тогда моя реализация по большей части не подойдет.
Re: Получить список папок с подпапками определенного разреше
Добавлено: 01 июн 2013, 13:40
Foenix
klblk, совершенно верно, так многие программы по отображению картинок или другой мультимедиа себя ведут. Обновляют списки они периодически или частями (например, если пользователь какую-то папочку захотел открыть)