#android #gridview
#Android #gridview
Вопрос:
я создал действие для отображения изображений из папки в памяти моего телефона. Для этой цели я использовал просмотр сетки и скольжение. Проблема в том, что всякий раз, когда я открываю свою активность в первый раз и прокручиваю ее полностью вниз, а затем прокручиваю обратно вверх, каждое изображение остается с идеальным размером и на своем месте. Но когда я приостанавливаю это действие и возобновляю его и прокручиваю его вниз и вверх, размеры изображений меняются, и некоторые из них оказываются перед другими. Помогите мне, пожалуйста
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:gravity="center">
<GridView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="90dp"
android:horizontalSpacing="10dp"
android:verticalSpacing="10dp"
android:gravity="center"
android:stretchMode="columnWidth"
android:numColumns="3"
android:id="@ id/gridview"></GridView>
</LinearLayout>
Элемент сетки
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content">
</ImageView>
Основное действие
public class MainActivity extends AppCompatActivity {
final List<String> ListOfFiles=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
final GridView gridView=findViewById(R.id.gridview);
final GalleryAdapter galleryAdapter=new GalleryAdapter();
String directory=null;
try{
directory=String.valueOf(Environment.getExternalStoragePublicDirectory("/compressed/"));
}catch (Exception e){
Log.e("TAG",e.toString());
}
if(directory!=null) {
final File imageDir = new File(directory);
final File[] files=imageDir.listFiles();
final int numberOfFiles=files.length;
final List<String> listOfFiles=new ArrayList<>();
//listOfFiles.clear();
for(int i=0;i<numberOfFiles;i ){
String path=files[i].getAbsolutePath();
if(path.endsWith("png") || path.endsWith("jpg") || path.endsWith("jpeg")){
listOfFiles.add(path);
}
}
ListOfFiles.clear();
ListOfFiles.addAll(listOfFiles);
Log.i("listOfFiles",listOfFiles.get(0));
galleryAdapter.setData(listOfFiles);
gridView.setAdapter(galleryAdapter);
}else{
// directory not found
Log.i("TAG","Directory not Found");
}
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent=new Intent(Intent.ACTION_VIEW)
.setDataAndType(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N ?
FileProvider.getUriForFile(MainActivity.this,getPackageName() ".provider",
new File(ListOfFiles.get(position))) :
Uri.fromFile(new File(ListOfFiles.get(position))),"image/*")
.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
}
});
}
final class GalleryAdapter extends BaseAdapter {
private List<String> data=new ArrayList<>();
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ImageView imageView;
if(convertView==null){
imageView=(ImageView) LayoutInflater.from(parent.getContext()).inflate(R.layout.imageforgridview,parent,false);
}
else{
imageView=(ImageView) convertView;
}
Glide.with(MainActivity.this).load(data.get(position)).into(imageView);
return imageView;
}
public void setData(List<String> listOfFiles) {
if(data.size()>0){
listOfFiles.clear();
}
data.addAll(listOfFiles);
notifyDataSetChanged();
}
}
}
Комментарии:
1. Вам нужно установить фиксированную высоту для вашего элемента сетки, если вы хотите сохранить ту же высоту, используйте
Staggered Layout Manager