2016-04-06 10 views
0

Ich habe ein Verzeichnis, unter dem ich viele Ordner habe, die ich in einer Aktivität auf GridView zeigen möchte.Wie zeigen Sie die Dateiordner in GridView in Android an?

Ich habe den Pfad für die Ordner und den Titel extrahiert, aber Zeichnungsrohlinge auf Wie implementiert man es in GridView. Mein Code ist hier für GridView Implementierung.

String[] albumNameOnly=thisIntent.getStringArrayExtra("AlbumString"); 
     gridView = (GridView) findViewById(R.id.grid_view); 
     columnWidth = getScreenWidth(); 
     InitilizeGridLayout(columnWidth); 
//The initialize grid is shown below. 
     MyAlbumAdapter myAlbumAdapter; 
     Log.e("Starting the Adapter","+++"); 
     myAlbumAdapter = new MyAlbumAdapter(getApplicationContext(), columnWidth,albumNameOnly); 
     gridView.setAdapter(myAlbumAdapter); 
    } 




public int getScreenWidth() { 
    int columnWidth; 
    WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 

    final Point point = new Point(); 
    try { 
     display.getSize(point); 
    } catch (NoSuchMethodError ignore) { // Older device 
     point.x = display.getWidth(); 
     point.y = display.getHeight(); 
    } 
    columnWidth = point.x; 
    return columnWidth; 
} 




private void InitilizeGridLayout(int screenWidth) { 
    Resources r = getResources(); 
    float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
      GRID_PADDING, r.getDisplayMetrics()); 

    columnWidth = (int) ((screenWidth - ((NUM_OF_COLUMNS + 1) * padding))/NUM_OF_COLUMNS); 

    gridView.setNumColumns(NUM_OF_COLUMNS); 
    gridView.setColumnWidth(columnWidth); 
    gridView.setStretchMode(GridView.NO_STRETCH); 
    gridView.setPadding((int) padding, (int) padding, (int) padding, 
      (int) padding); 
    gridView.setHorizontalSpacing((int) padding); 
    gridView.setVerticalSpacing((int) padding); 
} 

Und meine AlbumAdapter ist unten. Gerade jetzt möchte ich sie nur in GridView, deshalb setze ich es auf eine Zeichen in setResource für ImageView.

public MyAlbumAdapter(Context context, int columnWidth, String[] albumNameOnly) { 
     this.context = context; 
     Log.e("My Adapter Called", "++++"); 
     this.columnWidth = columnWidth; 
     this.albumNameOnly = albumNameOnly; 
    } 


    @Override 
    public int getCount() { 
     Log.e("Size of Directory", "++ " + albumNameOnly.length); 
     return MainActivity.directoryPath.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) { 
     View myGrid; 
     final ImageView imageView; 
     final TextView textView; 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      myGrid = new View(context); 
      myGrid = inflater.inflate(R.layout.album_grid_activity_layout, null); 
      imageView = (ImageView) myGrid.findViewById(R.id.no_image_placeholder); 
      textView = (TextView) myGrid.findViewById(R.id.album_title_main); 

      //   myImageView.setLayoutParams(new GridView.LayoutParams(200, 200)); 
      //   myImageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
//   myImageView.setPadding(1, 1, 1, 1); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setLayoutParams(new GridView.LayoutParams(columnWidth, columnWidth)); 
      imageView.setImageResource(R.drawable.no_image); 
      Log.e("++++", "AlbuM Name to be displayed" + albumNameOnly[position]); 
      textView.setText(albumNameOnly[position]); 

     } else { 
      myGrid = (View) convertView.getTag(); 
     } 
     return myGrid; 
    } 

Hier ist mein GridView Layout.

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/grid_view" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="#fffff"> 
</GridView> 

Und das Layout, auf dem ich das Bild und den Titel dafür festlegen.

<?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="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/no_image_placeholder"/> 
    <TextView 
     android:layout_width="match_parent" 
     android:id="@+id/album_title_main" 
     android:layout_height="wrap_content" 
     android:padding="12dip" 
     android:background="@android:color/tertiary_text_light" 
     android:textColor="@android:color/background_dark" 
     android:gravity="center" 
     android:layout_alignRight="@+id/no_image_placeholder" 
     android:layout_alignBottom="@+id/no_image_placeholder" 
     /> 

</RelativeLayout> 

Bitte helfen Sie mir in dieser Ausgabe. Ich werde sehr dankbar für die Hilfe sein.

+0

Haben Sie überprüft, dass String [] albumNameOnly Länge ist> 0 oder nicht null? – HendraWD

+0

Ja, für jetzt hat es 3 Saiten drin. –

+0

@Anand Vardhan: Irgendein besonderer Grund, warum Sie Gridview-Eigenschaften programmgesteuert festlegen, obwohl Sie GridView in Layout-XML platziert haben? Kannst du eine Hintergrundfarbe für GridView festlegen und bestätigen, ob sie tatsächlich auf deinem Layout platziert ist oder nicht? Wenn ja, was ist sein Rahmen? –

Antwort

0

Sie sollten das ViewHolder-Muster verwenden, um den Speicherverbrauch und die Leistung Ihres Adapters zu verbessern.

static class ViewHolder { 
    TextView textView; 
    ImageView imageView; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder viewHolder; 
    if(convertView==null){ 
     // inflate the layout 
     LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
     convertView = inflater.inflate(layoutResourceId, parent, false); 

     // well set up the ViewHolder 
     viewHolder = new ViewHolder(); 
     viewHolder.textView = (TextView) convertView.findViewById(R.id.textView); 
     viewHolder.textView = (ImageView) convertView.findViewById(R.id.imageView); 

     //just need to set the image once, because all images will be same 
     //you can also set the image directly from XML 
     viewHolder.imageView.setImageResource(R.drawable.no_image); 

     // store the holder with the view. 
     convertView.setTag(viewHolder); 
    }else{ 
     // we will avoid call findViewById() on resource everytime 
     // just use the viewHolder 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    // object item based on the position 
    ObjectItem objectItem = data[position]; 

    // assign values if the object is not null 
    if(objectItem != null) { 
     viewHolder.textView.setText(objectItem.itemName); 
    } 
    return convertView; 
} 

Ihr Problem ist, dass Sie

else { 
     myGrid = (View) convertView.getTag(); 
    } 

nennen, während Sie nicht den Tag zu Ihrem convertView mit ViewHolder Muster gesetzt haben

+0

Danke Hendra zu verwenden. Ich werde es implementieren und Sie wissen lassen, ob es funktioniert. –

+0

FYI, ViewHolder ist keine View selbst, aber es wird einen Verweis auf die View-Elemente enthalten, die vom Adapter wiederverwendbar sind. – HendraWD

+0

Dank Hendra. Ich werde es mir merken. –

0

ich die RecyclerView implementiert zur Darstellung der Dateiordner als Gitter in der Aktivität.

public class NewAlbumAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    String[] allAlbumName; 
    File[] filePathToAllAlbums; 
    ArrayList<File> firstImageOfAllFile; 
    Context context; 
    private static final int TYPE_HEADER = 2; 
    private static final int TYPE_ITEM = 1; 
    int countOfAlbums; 
    RecyclerViewClickListener recyclerViewClickListener; 


    public interface RecyclerViewClickListener { 
     void onClick(View view, int position); 

     void onLongClick(View view, int position); 
    } 

    public NewAlbumAdapter(Context context, File[] filePathToAllAlbums, String[] allAlbumName, int countOfAlbums, ArrayList<File> firstImageOfAllFile) { 
     this.context = context; 
     this.filePathToAllAlbums = filePathToAllAlbums; 
     this.allAlbumName = allAlbumName; 
     this.countOfAlbums = countOfAlbums; 
     this.firstImageOfAllFile = firstImageOfAllFile; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view; 

//  view= LayoutInflater.from(context).inflate(R.layout.no_photo_album,parent,false); 
//  MyViewHolder myViewHolder=new MyViewHolder(view); 
//  return myViewHolder; 
//  if (viewType == TYPE_ITEM) { 
     view = LayoutInflater.from(context).inflate(R.layout.no_photo_album, parent, false); 
     return RecyclerItemViewHolder.newInstance(view); 
//  } else if (viewType == TYPE_HEADER) { 
//   view = LayoutInflater.from(context).inflate(R.layout.recycler_header, parent, false); 
//   return new RecyclerHeaderViewHolder(view); 
//  } 
//  throw new RuntimeException("There is no type that matches the type " + viewType + " + make sure your using types correctly"); 
    } 

    public int getBasicItemCount() { 
     return countOfAlbums == 0 ? 0 : allAlbumName.length; 
    } 

    @Override 
    public int getItemCount() { 
     return getBasicItemCount(); 
//  return getBasicItemCount()+1; //Use this for header 

    } 



    public boolean isPositionHeader(int position) { 
     return position == 0; 
    } 


    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     View view; 
     RecyclerItemViewHolder itemHolder = (RecyclerItemViewHolder) holder; 
     if (firstImageOfAllFile.get(position) != null) { 
      Bitmap bitmap = BitmapFactory.decodeFile(firstImageOfAllFile.get(position).toString()); 
      itemHolder.setImageView(bitmap); 
     } else { 
      itemHolder.setImageView(R.drawable.no_photo_icon); 
     } 
     itemHolder.setAlbumTitle(allAlbumName[position]); 
     itemHolder.setNumberOfPic(String.valueOf(filePathToAllAlbums[position].list().length)); 

    } 
} 

Right now I am not showing any images which are currently there in the folders, so I am showing it with the drawable icon. 

And the items are being feeded into it using a item feeder. 

public class RecyclerItemViewHolder extends RecyclerView.ViewHolder { 
    private TextView albumTitle, numberOfPic; 
    private ImageView imageView; 

    public RecyclerItemViewHolder(View itemView, TextView albumTitle, TextView numberOfPic, ImageView imageView) { 
     super(itemView); 
     this.albumTitle = albumTitle; 
     this.numberOfPic = numberOfPic; 
     this.imageView = imageView; 
    } 

    public static RecyclerItemViewHolder newInstance(View parent){ 
     TextView albumTitle=(TextView)parent.findViewById(R.id.album_main_title_textview); 
     TextView numberOfPic=(TextView)parent.findViewById(R.id.number_of_pic_textview); 
     ImageView imageView=(ImageView)parent.findViewById(R.id.no_image_placeholder); 
     return new RecyclerItemViewHolder(parent,albumTitle,numberOfPic,imageView); 
    } 
    public void setAlbumTitle(String albumStringArray){ albumTitle.setText(albumStringArray); } 

    public void setNumberOfPic(String numberOfPicSetter){ 
     numberOfPic.setText(numberOfPicSetter); 
    } 

    public void setImageView(int imageId){ 
     imageView.setImageResource(imageId); 
    } 

    public void setImageView(Bitmap bitmap){ 

     imageView.setImageBitmap(bitmap); 
    } 

}

und die Elemente werden in die RecyclerView feeded einen Artikel Feeder-Klasse.

So habe ich die Anzeige der Dateiordner in RecyclerView und die Verwendung des CardView als Layout erreicht.

Entschuldigung für die späte Antwort. Und ich bin dankbar für @ Hendra und @ Sandeep für ihre Hilfe.

Verwandte Themen