Sorbete
Sorbete

Reputation: 63

Android Slow GridView

I'm new to Android Development, I ran into a performance issue. When my GridView has too many items it becomes kinda slow. Is there any way to make it behave a little faster?

Here is the code im using:

Adapter:

public class CharactersAdapter extends BaseAdapter {
private Context mContext;
private int screenSize;
private int columns;
// Constructor

public CharactersAdapter(Context c,int screenSize) {
    this.screenSize=screenSize;
    mContext = c;
}

public CharactersAdapter(Context c) {
    mContext = c;
}

@Override
public int getCount() {
    return charPics.length;
}

@Override
public Object getItem(int i) {

    return charPics[i];
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
    ImageView imageView;
    this.columns=mContext.getResources().getInteger(R.integer.grid_columns);
    if (convertView == null) {

        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(screenSize /this.columns,screenSize      /this.columns));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    }else{
        imageView = (ImageView) convertView;
    }
    imageView.setImageDrawable(mContext.getResources().getDrawable(charPics[i]));
    return imageView;
}}

Fragment

public class CharacterFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    DisplayMetrics displaymetrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    int screenWidth = displaymetrics.widthPixels;


    View rootView = inflater.inflate(R.layout.fragment_character, container, false);
    GridView gridview = (GridView)rootView.findViewById(R.id.gridview);
    gridview.setAdapter(new CharactersAdapter(getActivity(),screenWidth));

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {

            Intent i = new Intent(getActivity().getApplicationContext(), CharacterActivity.class);
            // Pass image index
            i.putExtra("pos", position);
            startActivity(i);
        }
    });

    return rootView;
}

Am I doing something wrong?....

Upvotes: 1

Views: 2128

Answers (2)

Sorbete
Sorbete

Reputation: 63

I ended up using the Picasso library to load images. It works like a charm.

Upvotes: 0

Eefret
Eefret

Reputation: 4774

I really recomend you to use the Holder Pattern there, in it you save the view you create to be reused and save memory what will deliver more performance, here is a very good tutorial on it. Also for the images loading you could use Universal Image Loader that will make the Image loading UIL asynchronously so your UI Thread dont come up slow. Good Luck

Upvotes: 3

Related Questions