mam coś gotowe ale brakuje tekstów i ikon trzeba samemu je dodać do R.string i R.drawable
kod klasy
public class Select {
private final ArrayList<File> mFiles = new ArrayList<File>();
private final ArrayList<File> mSelect = new ArrayList<File>();
private File mPatch;
private AlertDialog.Builder mDialog;
private FileAdapter mAdapter;
private ImageView mIcon;
private TextView mTitle;
private LinearLayout mTop;
public static int FOLDER = 1;
public static int FILE = 2;
public static int FOLDER_FILE = 3;
private int mode = 1;
private Select.buttonListner callBack = null;
public interface buttonListner {
void OnClock();
}
public void registreListner(Select.buttonListner callBack) {
this.callBack = callBack;
}
public Select(final Context context) {
mDialog = new AlertDialog.Builder(context);
final View inflater = LayoutInflater.from(context).inflate(R.layout.select_list, null);
mDialog.setView(inflater);
mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface arg0) {
mFiles.clear();
mSelect.clear();
}
});
mDialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
if (callBack != null) callBack.OnClock();
}
});
mAdapter = new FileAdapter(context);
mTop = (LinearLayout) inflater.findViewById(R.id.select_list_top);
mIcon = (ImageView) inflater.findViewById(R.id.select_list_icon);
mTitle = (TextView) inflater.findViewById(R.id.select_list_title);
final ListView Lista = (ListView) inflater.findViewById(R.id.select_list_main);
Lista.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int item, long arg3) {
if (item >= 0 && item < mFiles.size()) {
File file = mFiles.get(item);
if (file.isDirectory()) {
change(file);
}
}
}
});
Lista.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int item, long arg3) {
Toast.makeText(context, (item == 0) ? mPatch.getPath() : mFiles.get(item).getPath(), Toast.LENGTH_SHORT).show();
return true;
}
});
Lista.setAdapter(mAdapter);
}
public void setMode(final int mode) {
this.mode = mode;
}
public void setIcon(final int icon) {
mIcon.setImageResource(icon);
}
public void setTitle(final int title) {
mTitle.setText(title);
}
public void setTop(final int visible) {
mTop.setVisibility(visible);
}
public File[] getSelected() {
return (mSelect.isEmpty()) ? new File[0] : mSelect.toArray(new File[mSelect.size()]);
}
public File getPatch() {
return mPatch;
}
public void show(final String startPatch) {
mDialog.show();
final File patch = new File((startPatch != null) ? startPatch : "");
change((patch.exists() && patch.canRead()) ? patch : null);
}
private void change(final File dir) {
mPatch = (dir == null || !dir.exists()) ? Environment.getExternalStorageDirectory() : dir;
mFiles.clear();
mFiles.addAll(Arrays.asList(mPatch.listFiles(filter)));
Collections.sort(mFiles, sort);
mFiles.add(0, new File((mPatch.getParent() == null) ? Environment.getExternalStorageDirectory().getParent() : mPatch.getParent()));
mAdapter.updateAdapter();
}
private final FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
final File patch = new File(dir.getPath(), name);
switch (mode) {
case FOLDER:
return (patch.canWrite() && !patch.isHidden() && patch.isDirectory());
default:
return (patch.canRead() && !patch.isHidden());
}
}
};
private final Comparator<File> sort = new Comparator<File>() {
public int compare(File o1, File o2) {
if ((o1.isFile() || o1.isDirectory()) && (o2.isFile() || o2.isDirectory())) {
if (o1.isDirectory() && o2.isFile()) {
return -1;
} else if (o1.isFile() && o2.isDirectory()) {
return +1;
} else {
return 0;
}
}
return 0;
}
};
private class FileAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private int count = 0;
private final SimpleDateFormat dateFormat = new SimpleDateFormat();
public FileAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return count;
}
public void updateAdapter() {
count = mFiles.size();
notifyDataSetChanged();
}
public File getItem(final int position) {
return mFiles.get(position);
}
public long getItemId(final int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.select_item, null);
holder.text = (TextView) convertView.findViewById(R.id.select_text_item);
holder.icon = (ImageView) convertView.findViewById(R.id.select_image_item);
holder.detale = (TextView) convertView.findViewById(R.id.select_detale_item);
holder.check = (ImageView) convertView.findViewById(R.id.select_detale_check);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final File file = mFiles.get(position);
String name = file.getName();
int icon = R.drawable.info_select;
if (file.isDirectory()) {
if (position == 0) {
name = "...";
icon = R.drawable.back;
} else {
icon = R.drawable.folder;
}
} else if (file.isFile()) {
icon = R.drawable.file;
}
holder.icon.setImageResource(icon);
holder.text.setText(name);
holder.detale.setText((position == 0) ? mPatch.getPath() : extractDate(file.lastModified(), convertView.getResources().getString(R.string.data_time_format)));
switch (mode) {
case FILE:
holder.check.setVisibility((file.canRead() && file.isFile()) ? View.VISIBLE : View.GONE);
break;
case FOLDER_FILE:
holder.check.setVisibility((file.canRead() && position > 0) ? View.VISIBLE : View.GONE);
break;
default:
holder.check.setVisibility(View.GONE);
}
if (holder.check.getVisibility() == View.VISIBLE) {
holder.check.setImageResource(mSelect.contains(file) ? R.drawable.chackebox_on : R.drawable.chackebox_off);
holder.check.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
if (mSelect.contains(file)) {
mSelect.remove(mSelect.lastIndexOf(file));
holder.check.setImageResource(R.drawable.chackebox_off);
} else {
mSelect.add(file);
holder.check.setImageResource(R.drawable.chackebox_on);
}
}
});
}
return convertView;
}
final class ViewHolder {
TextView text;
ImageView icon;
TextView detale;
ImageView check;
}
private String extractDate(final long data, final String format) {
dateFormat.applyLocalizedPattern(format);
return dateFormat.format(new Date(data));
}
}
}
sposób użycie
final Select select = new Select(kontekst);//w miejscu kontekst wpisz bieżący kontekst
select.setIcon(R.drawable.ikona);
select.setTitle(R.string.tytul);
select.setMode(Select.FOLDER);//tryb co ma być wynierane
select.registreListner(new Select.buttonListner() {
public void OnClock() {
select.getPatch();
//funkcja zwrotna po dokonaniu wyboru
w tym przypadku wybrany folder
}
});
select.show(null);
definicja wyglądy okna w listą
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/select_list_top"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left|center_vertical"
android:paddingTop="6dp"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<ImageView android:id="@+id/select_list_icon"
android:layout_width="32dp"
android:layout_height="32dp"/>
<HorizontalScrollView android:id="@+id/select_list_scroll"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:scrollbars="none">
<TextView android:id="@+id/select_list_title"
android:singleLine="true"
android:layout_width="wrap_content"
android:layout_height="32dp"
android:textSize="21dp"
android:textColor="#FFFFFF"
android:paddingLeft="10dp"
android:ellipsize="marquee"
android:gravity="left|center_vertical"/>
</HorizontalScrollView>
</LinearLayout>
<ImageView android:src="@drawable/dialog_divider_horizontal_light"
android:layout_width="fill_parent"
android:layout_height="1dp"/>
<ListView android:id="@+id/select_list_main"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#00000000"
android:cacheColorHint="#00000000"
android:layout_weight="1.0"
android:dividerHeight="1dp"
android:divider="@drawable/list_divider"
android:gravity="fill_vertical"/>
</LinearLayout>
definicja wyglądu pozycji na liście
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingLeft="5dp">
<ImageView android:id="@+id/select_image_item"
android:layout_width="48dp"
android:layout_height="48dp"
android:scaleType="centerCrop"/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_toRightOf="@+id/select_image_item"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|center_vertical"
android:paddingRight="45dp">
<TextView android:id="@+id/select_text_item"
android:singleLine="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:textStyle="bold"
android:textColor="#FFFFFF"
android:paddingLeft="5dp"
android:paddingRight="0dp"
android:paddingTop="4dp"
android:paddingBottom="0dp">
</TextView>
<TextView android:id="@+id/select_detale_item"
android:singleLine="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="13dp"
android:paddingLeft="5dp"
android:paddingRight="0dp"
android:paddingTop="0dp"
android:paddingBottom="3dp">
</TextView>
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="right|center_vertical"
android:paddingRight="5dp">
<ImageView android:id="@+id/select_detale_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/chackebox_off"
android:scaleType="center"/>
</LinearLayout>
</RelativeLayout>
guziki do R.drawable
chackebox_off.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_check_off_pressed"
android:state_pressed="true" />
<item android:drawable="@drawable/btn_check_on"
android:state_focused="true" />
<item android:drawable="@drawable/btn_check_off" />
</selector>
chackebox_on.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_check_on_pressed"
android:state_pressed="true" />
<item android:drawable="@drawable/btn_check_off"
android:state_focused="true" />
<item android:drawable="@drawable/btn_check_on" />
</selector>