Estoy trabajando en una aplicación que muestra las imágenes de estado de WhatsApp en GridView. Al iniciar la aplicación, muestra imágenes correctamente pero muestra algunos elementos de cuadrícula en blanco. Conozco este elemento de cuadrícula en blanco debido a los archivos de video en el directorio, pero no sé cómo separar los archivos de imagen de los videos. Usé mapa de bits para mostrar imágenes en la cuadrícula. Entonces muestra una vista de cuadrícula en blanco. Solo necesito imágenes en gridview.

Aquí está mi actividad principal

public class MainActivity extends AppCompatActivity {
private String[] FilePathStrings;
private String[] FileNameStrings;
private File[] listFile;
GridView grid;
GridViewAdapter adapter;
File file;
String extension = ".jpg";
String TAG;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
        // Locate the image folder in your SD Card
        file = new File("/storage/emulated/0/WhatsApp/Media/.Statuses/");


    if (file.isDirectory()) {
        listFile = file.listFiles();

        // Create a String array for FilePathStrings
        FilePathStrings = new String[listFile.length];
        // Create a String array for FileNameStrings
        FileNameStrings = new String[listFile.length];


        for (int i = 0; i < listFile.length; i++) {
            if(listFile[i].getName().endsWith(extension)) {
                // Get the path of the image file
                FilePathStrings[i] = listFile[i].getAbsolutePath();
                // Get the name image file
                FileNameStrings[i] = listFile[i].getName();
            }
        }

    }

    // Locate the GridView in gridview_main.xml
    grid = (GridView) findViewById(R.id.gridview);
    grid.setColumnWidth(200);
    grid.setHorizontalSpacing(10);
    grid.setVerticalSpacing(10);
    grid.setNumColumns(2);
    grid.setStretchMode(GridView.STRETCH_SPACING_UNIFORM);
    // Pass String arrays to LazyAdapter Class
    adapter = new GridViewAdapter(this,FilePathStrings, FileNameStrings);
    // Set the LazyAdapter to the GridView
    grid.setAdapter(adapter);

Aquí está mi GridViewAdapter

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class GridViewAdapter extends BaseAdapter{
private Activity activity;
private String[] filepath;
private String[] filename;

private static LayoutInflater inflater = null;

public GridViewAdapter(Activity a, String[] fpath, String[] fname) {
    activity = a;
    filepath = fpath;
    filename = fname;
    inflater = (LayoutInflater) activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

public int getCount() {
    return filepath.length;

}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if (convertView == null)
        vi = inflater.inflate(R.layout.gridview_item, null);
    // Locate the TextView in gridview_item.xml
    TextView text = (TextView) vi.findViewById(R.id.text);
    // Locate the ImageView in gridview_item.xml
    ImageView image = (ImageView) vi.findViewById(R.id.image);

    // Set file name to the TextView followed by the position
    text.setText(filename[position]);

    // Decode the filepath with BitmapFactory followed by the position
    Bitmap bmp = BitmapFactory.decodeFile(filepath[position]);

    // Set the decoded bitmap into ImageView
    image.setImageBitmap(bmp);
    return vi;
}

}
0
manivanna balaji 13 sep. 2018 a las 13:23

4 respuestas

La mejor respuesta

Intenta cambiar listFile = file.listFiles(); a

listFile = file.listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.getName().toLowerCase().endsWith(extension);
    }
});

Y en el ciclo for, elimine la condición if. ¡Espero que ayude!

0
i_A_mok 15 sep. 2018 a las 03:55

Note Que he implementado esto usando recyclerview and RecyclerView adapter.

No es necesario insertar el archivo de videos en un lugar de elemento separado. Tu ItemHolder debe tener dos ImageViews. Uno para el artículo y otro para Video Icon. inicialmente, Video Icon ImageView la visibilidad sería Gone or Invisible. En el adaptador mientras se vinculan los datos, simplemente verifique la ruta del archivo. si la ruta del archivo termina con la extensión de video, entonces la visibilidad Video Icon ImageView debe cambiarse a visible. Estoy agregando aquí XML and item Holder's code. Código XML para el elemento Recyleriew

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cv_status_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@color/colorWhite">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.github.siyamed.shapeimageview.RoundedImageView
        android:id="@+id/iv_status"
        android:layout_width="match_parent"
        android:layout_height="90dp"
        app:siRadius="6dp"
        app:siBorderColor="#dfdfdf"
        app:siBorderWidth="1dp"
        app:siSquare="true"

        />

    <ImageView
        android:id="@+id/iv_play_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerInParent="true"
        android:contentDescription="@null"
        android:visibility="gone"
        android:background="@drawable/toolbar_transparent"
        app:srcCompat="@drawable/float_video_play" />

    <android.support.v7.widget.AppCompatCheckBox
        android:id="@+id/cb_selection"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone" />
</RelativeLayout>
</RelativeLayout>

Código para ItemHolder a BindData

 public void bindData(StatusObject statusObject, int position, int size, boolean selectionMode) {
    super.bindData(statusObject, position, size);
    this.selectionMode = selectionMode;
    if (statusObject.getPath().endsWith(".mp4")) {
        ivPlayIcon.setVisibility(View.VISIBLE);
    }
    else if (statusObject.getPath().endsWith(".gif")){
        ivPlayIcon.setVisibility(View.VISIBLE);
    }
    else ivPlayIcon.setVisibility(View.GONE);
    if (selectionMode)
        cbSelection.setVisibility(View.VISIBLE);
    else cbSelection.setVisibility(View.GONE);
    cbSelection.setChecked(statusObject.isSelected());
    cbSelection.setClickable(false);
    //        ivStatus.setClipToOutline(true);
    Glide.with(itemView)
            .asBitmap()
            .load(Uri.fromFile(new File(statusObject.getPath())))
            .into(ivStatus);
}
0
Shahkar Raza 13 sep. 2018 a las 10:51

Si no desea reproducir el video, puede mostrar la miniatura del video de la siguiente manera,

 Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videofile.getAbsolutePath(), MediaStore.Video.Thumbnails.MICRO_KIND)
0
Jyoti JK 14 sep. 2018 a las 03:52

Verifiqué tu código haciendo depuración y funciona bien, pero ¿puedes mostrar tu GridViewAdapter?

0
Vijay Singh Chouhan 13 sep. 2018 a las 10:46