2017-01-20 12 views
0

Я использую Gridview в своем приложении, чтобы показывать изображения из папки на Sdcard ... Моя проблема - это прокрутка в GridView, это не так гладко, как приложение Gallery. Вот код адаптера -GridView scroll not smooth

public class GridViewAdapter extends BaseAdapter { 

    // Declare variables 
    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 ImageView in gridview_item.xml 
     ImageView img = (ImageView) vi.findViewById(R.id.image); 


     // Set file name to the TextView followed by the position 
     TextView txt = (TextView) vi.findViewById(R.id.name); 

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

     // Set the decoded bitmap into ImageView 
     img.setImageBitmap(bmp); 
     txt.setText(filename[position]); 
     return vi; 
    } 
} 

Как решить эту проблему и сделать прокрутку гладкой?

+1

Вы должны использовать ViewHolder – Rachit

ответ

1

Вы должны выполнить BitmapFactory.decodeFile в отдельном потоке, как этот учебник: https://developer.android.com/training/displaying-bitmaps/process-bitmap.html

Я предлагаю вам использовать кэш-память, чтобы не перегрузить изображения каждый раз, когда пользователь пролистайте: https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

1

Вы можете сделай это.

  1. Реализована загрузка изображений Асинхронного так, что каждое изображение загружается асинхронно
  2. использования сделать из третьей партии ImageLoaders и загрузка изображений размера миниатюр. For.ex UniversalImageLoader. check this подробнее
  3. Вы можете использовать RecyclerView с GridLayoutManager вместо GridView, это более оптимизированное управление. напр: http://www.android-examples.com/android-recyclerview-with-gridview-gridlayoutmanager/

дополнительное обозначение: http://www.technotalkative.com/android-select-multiple-photos-from-gallery/

0

BitmapFactory.decodeFile тяжелая операция для выполнения на Ui нить снова и снова. вы используете некоторую библиотеку кеша.

Вы можете использовать библиотеку для загрузки изображений, такую ​​как Universal image loader, Glide или picasso.

Просьба попробовать с помощью держателя.

class Holder{ 
ImageView img ; 
TextView txt; 
} 


public View getView(int position, View convertView, ViewGroup parent) {  
    Holder holder; 
    if (convertView == null) 
{ 
    convertView = inflater.inflate(R.layout.gridview_item, null); 
     holder=new Holder(); 

    holder.img = (ImageView) convertView.findViewById(R.id.image); 

    holder.txt = (TextView) convertView.findViewById(R.id.name); 

    convertView.setTag(holder) 
    } 
    else 
{ 
    holder=(Holder)convertView.getTag(); 
} 


    Picasso.with(activity) .load(filepath[position]) .into(holder.img); 
    txt.setText(filename[position]); 
    return convertView; 
} 
+0

я использовал Пикассо, но он не показывает images..my Imageviews пустые .. Picasso.with (активность) \t \t .load (путь_к_файлу [положение]) \t \t .into (img); – DarShan

+0

попытайтесь реализовать это, используя способ, как отредактировать мой ответ. – Ankur1994a

+0

Я использовал Glide, работает лучше, чем Picasso – DarShan