Изображения в GridView нарушены при повторном открытии gridview в моей деятельности во второй раз

#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