我在对话框内使用gridView画廊构建应用程序.所有画廊都运作良好,但现在我想将一些照片与另一个照片分开(需要创建某种标题).例如,我在SD卡文件夹中有一些名为:1v1.jpg / 1v2.jpg / 1v3.jpg / 2v1.jpg / 2v2.jpg的照片,现在我想将其显示在我的gridView画廊中(假设它具有2列)
外观如何:
1个
1v1.jpg 1v2.jpg
1v3.jpg
2
2v1.jpg 2v2.jpg
等等
现在我只有照片的画廊
一些代码:
GridAdapter:
public class GridAdapter extends BaseAdapter {
Context mContext;
ArrayList<File> listFiles;
public GridAdapter(Context context, ArrayList<File> files) {
this.mContext = context;
this.listFiles = files;
}
@Override
public int getCount() {
return listFiles.size();
}
@Override
public Object getItem(int position) {
return listFiles.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null)
{
convertView = LayoutInflater.from(mContext).inflate(R.layout.my_grid, parent, false);
}
final ImageView iv = (ImageView) convertView.findViewById(R.id.imageView);
Glide.with(mContext)
.load(listFiles.get(position).getAbsolutePath()) //path to picture
.into(iv);
return convertView;
}
} //end of gridadapter
//剩余代码
public ArrayList<File> photoList;
public ArrayList<String> albumList;
photoList = imageReader(photoDir);
albumList = albumReader(photoDir);
//function to get all file paths (works)
private ArrayList<File> imageReader(File root)
{
ArrayList<File> a = new ArrayList<>();
File[] files = root.listFiles();
for (File file : files) {
if (file.isDirectory()) {
a.addAll(imageReader(file));
} else {
if (file.getName().length() == 14)
{
a.add(file);
}
}
}
return a;
}
//function to get all headers name (works)
private ArrayList<String> albumReader(File root)
{
ArrayList<String> pages = new ArrayList<>();
File[] files = root.listFiles();
for (File file : files)
{
String photoName;
String temp = "";
photoName = file.getName();
if(photoName.length()==14)
{
photoName = photoName.substring(0, 4);
if (!temp.equals(photoName))
{
if(pages.isEmpty() || !pages.contains(photoName))
{
pages.add(photoName);
temp = photoName;
}
else
{
break;
}
}
}
}
return pages;
}
public void firstChoiceDialogGallery() {
inflater = this.getLayoutInflater();
// Dialog layout
v = inflater.inflate(R.layout.dialog_choice, null);
// Get gridView from dialog_choice
gV = (GridView) v.findViewById(R.id.gridView);
// GridAdapter (Pass context and files list)
GridAdapter adapter = new GridAdapter(this, photoList);
// Set adapter
gV.setAdapter(adapter);
final AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
builder2.setTitle("MY GALLERY");
builder2.setView(v);
builder2.setPositiveButton("NEXT", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setNegativeButton("BACK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder2.setCancelable(false);
final AlertDialog dialog = builder2.create();
dialog.show();
}
XML:
grid_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="@integer/width"
android:layout_height="@integer/height"
android:adjustViewBounds="true"
android:id="@+id/imageView"
android:layout_margin="5dp"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
grid.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog_choice"
android:layout_width="match_parent"
android:layout_height="match_parent">
<GridView
android:id="@+id/gridView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:numColumns="@integer/column_count"
android:clickable="true"/>
</RelativeLayout>
如您所见,我编写了获取标头名称的函数,图库也可以工作,但是现在我不知道如何在特定位置放置此名称以及如何执行此操作.
我正在考虑将其放到现有适配器上,但不起作用
附言:我读到了关于StickyGridHeaders的信息,因此在此处给出指向lib源的链接是没有答案的,因为已经知道了.问题是我不确定这就是我想要的,我不知道如何在现有代码中实现它
解决方法:
需要创建一个名为item_row.xml或任何您想要的自定义适配器
item_row.xml
在布局中定义所需的视图,根据您的情况,您可以从我看到的图像中看到图像和文本:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="105dp"
android:layout_height="120dp">
<ImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/ImgItem"
android:layout_marginTop="7dp"
android:layout_gravity="center"/>
<TextView
android:id="@+id/textItem"
android:layout_width="120dp"
android:layout_height="25dp"
android:textSize="16sp"
android:layout_marginBottom="3dp"
android:layout_gravity="center"
android:textColor="#182b4b"
android:gravity="center" />
</LinearLayout>
现在,创建您的适配器类,在这里您指示适配器以膨胀刚创建的视图(item_row,xml):
rowitem.java
确保从
ArrayAdapter
public class rowitem extends ArrayAdapter<String> {
private final Activity context;
private String[] nameItem;
private Bitmap[] iconsItem;
public rowitem(Activity context, String[] nameItem, Bitmap[] iconsItem) {
super(context, R.layout.adapter_sketchmenuside, nameItem);
// TODO Auto-generated constructor stub
this.context = context;
this.nameItem = nameItem;
this.iconsItem = iconsItem;
}
public View getView(int posicion, View view, ViewGroup parent){
LayoutInflater inflater = context.getLayoutInflater();
//inflate the item_row.xml view
View rowView = inflater.inflate(R.item_row,null,
true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.textItem);
ImageView imageView = (ImageView) rowView.findViewById(R.id.ImgItem);
// Do your stuff
}
作为最后一步,无论您在哪里声明它,都将新的自定义适配器设置为gridview:
GridView myGrid = (GridView) view.findViewById(R.id.GrdCategory);
//in wherever you want, set the adapter:
myGrid.setAdapter(new rowitem(getActivity(),
namesArray, //here you send an Array with Strings for the names of the images
imgArray, // here you send an array with the images you want to load
));
可以,任何问题都可以让我知道,如果正确,请标记为正确答案.编码愉快!