Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Optimize listview performance Android

I have a listView (vertical) and every list item has a horizontal list view (horizontal).

But the problem is when i scroll the horizontal scrollview in the row the vertical list is also calling getView()...

So, there is a huge performance hit.. So , can any one tell me a better solution to it ..

    public class GridViewAdapter extends BaseAdapter {

    List<List<Hotel>> gridDatasource;
    Context mContext;

    public GridViewAdapter(List<List<Hotel>> gridDatasource, Context context) {
        this.gridDatasource = gridDatasource;
        this.mContext = context;
    }

    public void setGridDatasource(List<List<Hotel>> gridDatasource) {
        this.gridDatasource = gridDatasource;
    }

    @Override
    public int getCount() {
        if (gridDatasource == null) {
            return 0;
        }
        return gridDatasource.size();
    }

    @Override
    public Object getItem(int position) {
        return gridDatasource.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        GridViewHolder holder;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.gridview_table_cell,
                    null);

            holder = new GridViewHolder();
            holder.headerView = (TextView) convertView
                    .findViewById(R.id.gridViewRowHeader);
            holder.listView = (HorizontalListView) convertView
                    .findViewById(R.id.gridViewHorizontalListView);
            convertView.setTag(holder);
        } else {
            holder = (GridViewHolder) convertView.getTag();
            Log.d("TAG", "Reaching Here");
        }
        holder.headerView.setText("Hello From Sandeep");
        HorizontalListViewAdapter adapter = new HorizontalListViewAdapter(
                mContext, gridDatasource.get(position));
        holder.listView.setAdapter(adapter);
        return convertView;
    }

}

static class GridViewHolder {
    TextView headerView;
    HorizontalListView listView;
}

public class HorizontalListViewAdapter extends BaseAdapter {
    Context mContext;
    List<Hotel> mHotels;

    public HorizontalListViewAdapter(Context context, List<Hotel> hotels) {
        this.mContext = context;
        this.mHotels = hotels;
    }

    @Override
    public int getCount() {
        if (mHotels == null) {
            return 0;
        }
        return mHotels.size();
    }

    @Override
    public Object getItem(int position) {
        return mHotels.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        HotelCell cell = (HotelCell) convertView;
        if (cell == null) {
            cell = new HotelCell(mContext);
        } else {
            Log.d("TAG", "Reached here 2");
        }
        cell.setHotel(mHotels.get(position));
        cell.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext,
                        HotelDetailActivity.class);
                intent.putExtra("DATA", ((HotelCell) v).getHotel());
                startActivity(intent);
            }
        });
        cell.setPadding(0, 0, 10, 0);
        return cell;
    }
}
like image 600
Sandeep Dhull Avatar asked Oct 06 '22 21:10

Sandeep Dhull


1 Answers

Dear i suggest to try My this Code

public View getView(final int position, View convertView, ViewGroup parent) 
    {
         View v = convertView;
         ViewHolder holder;

         if (v == null) 
         {
             v = inflater.inflate(R.layout.custom_image_layout, null);
             holder = new ViewHolder();
             holder.txtFileName = (TextView) v.findViewById(R.id.txtFileName);
             holder.imageView = (ImageView) v.findViewById(R.id.imgView);
             v.setTag(holder);
         } else 
         {
             holder = (ViewHolder) v.getTag();
         }
holder.imageView.setImageBitmap(bm);
holder.txtFileName.setText(""+nameoffile);
return v;
    }
    static class ViewHolder 
    {
         public ImageView imageView;
         public TextView txtFileName;
    }

Use The Holder Class

like image 128
Zala Janaksinh Avatar answered Oct 10 '22 10:10

Zala Janaksinh