如何在我的网格视图上加载更多项目时消除我的UI上的延迟?

时间:2014-10-24 04:31:47

标签: android gridview lazy-loading lag onscrolllistener

请帮我解决有关网格视图的问题。目前我正在开发一个图库应用程序,其中显示图像的网格视图。现在,问题是每次我通过触发滚动方法在网格视图上加载更多项目时,UI在显示新加载的项目之前滞后一段时间。我只想修复滞后,或者你可以提出一些改进我的网格视图的想法或技巧。也许,如果可能的话,你可以给我一个关于如何在网格视图底部放置一个进度条的想法,该进度条将在添加网格视图项目时显示,并在添加网格视图项目后消失

这些是代码:

这是实现on scroll方法的主要活动,当触发scroll方法时,如果满足条件,它将调用Utils的GenerateData内部类,该类扩展AsyncTask并返回数组列表和此数组列表将被添加到主要活动的数组中。

GridViewActivity:

public class GridViewActivity extends Activity implements AbsListView.OnScrollListener, AbsListView.OnItemClickListener{
    private GridView gridView;
    private GridViewImageAdapter adapter;
    private Utils utils;
    private GenerateData generateData;
    private ArrayList<HashMap<String, String>> galleryAttributes;
    private int columnWidth;
    private int urlPageIndex = 1;
    private boolean hasRequestedMore;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_grid_view);

        setTitle("Gallery");

        gridView = (GridView) findViewById(R.id.grid_view);
        utils = new Utils(this);
        InitializeGridLayout();

        galleryAttributes = new ArrayList<HashMap<String, String>>();
        generateData = utils.new GenerateData(urlPageIndex);
        try {
            galleryAttributes.addAll(generateData.execute().get());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        adapter = new GridViewImageAdapter(GridViewActivity.this, galleryAttributes , columnWidth);
        gridView.setAdapter(adapter);
        gridView.setOnScrollListener(this);
        gridView.setOnItemClickListener(this);

    }

    public void InitializeGridLayout() { 
        Resources r = getResources();
        float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,AppConstant.GRID_PADDING, r.getDisplayMetrics());
        columnWidth = (int) ((utils.getScreenWidth() - ((AppConstant.NUM_OF_COLUMNS + 1) * padding)) / AppConstant.NUM_OF_COLUMNS);
        gridView.setNumColumns(AppConstant.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);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // TODO Auto-generated method stub
        Intent intent = new Intent(GridViewActivity.this,
                CarouselViewActivity.class);
        intent.putExtra("position", position);
        intent.putExtra("galleryAttributes", galleryAttributes);
        startActivity(intent);
        Log.e("onItemClick: ", "" + position);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub
        Log.e("onScrollStateChanged: ", "" + scrollState);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
        Log.e("onScroll: ", "firstVisibleItem:" + firstVisibleItem
                + " visibleItemCount:" + visibleItemCount + " totalItemCount:"
                + totalItemCount);
        if (!hasRequestedMore) {
            int lastInScreen = firstVisibleItem + visibleItemCount;
            if (lastInScreen >= totalItemCount) {
                hasRequestedMore = true;
                onLoadMoreItems();
            }
        }
    }

    public void onLoadMoreItems() {
        if (urlPageIndex < 3) {
            urlPageIndex++;
            generateData = utils.new GenerateData(urlPageIndex);
            try {
                galleryAttributes.addAll(generateData.execute().get());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            adapter.notifyDataSetChanged();
            hasRequestedMore = false;
        }
    }

}

这是我的Utils类,这个类负责从Json检索数据并将其放在将从其调用者返回的数组列表中。

的Utils:

public class Utils {

    private Context context;
    private ProgressDialog progressDialog;

    public Utils(){}

    public Utils(Context context){
        this.context = context;
    }

    public class GenerateData extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>>{
        private JSONArray dataJsonArr;
        private JsonParser jParser;
        private JSONObject json;
        private JSONObject c;
        private HashMap<String, String> map;
        private ArrayList<HashMap<String,String>> galleryAttributes;
        private int urlPageIndex;
        private GridViewImageAdapter gridViewAdapter;
        private boolean onLoadMore = false;

        public GenerateData(int urlPageIndex){
            this.urlPageIndex = urlPageIndex;
            new InitializeJsonArray().execute();
        }

        @Override
        protected ArrayList<HashMap<String, String>> doInBackground(
                Void... params) {
            // TODO Auto-generated method stub

            try{
                for(int i = 0; i< dataJsonArr.length(); i++)
                {
                    c = dataJsonArr.getJSONObject(i);
                    map = new HashMap<String, String>();
                    map.put("Link", c.getString("Link"));
                    galleryAttributes.add(map);
                }
            }

            catch (JSONException e) {
                e.printStackTrace();
            }   
            return galleryAttributes;
        }

        public class InitializeJsonArray extends AsyncTask<Void, Void, Void>{ 
            @Override
            protected Void doInBackground(Void... params) {
                // TODO Auto-generated method stub
                dataJsonArr = null;
                jParser = new JsonParser();
                json = jParser.getJSONFromUrl(AppConstant.JSON_URL+urlPageIndex);
                try {
                    dataJsonArr = json.getJSONArray(AppConstant.JSON_ARRAY_NAME);
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                galleryAttributes = new ArrayList<HashMap<String, String>>();
                galleryAttributes.ensureCapacity(dataJsonArr.length());
                return null;
            }   
        }
    }

    @SuppressLint("NewApi") public int getScreenWidth() {
        int columnWidth;
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();

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

最后我的GridViewImageAdapter类:

public class GridViewImageAdapter extends BaseAdapter{
    private Context context;
    private int imageWidth;
    private ArrayList<HashMap<String, String>> galleryAttributes;
    ImageView imageView;

    public GridViewImageAdapter(Context context, ArrayList<HashMap<String, String>> galleryAttributes, int imageWidth){
        this.galleryAttributes = galleryAttributes;
        this.context = context;
        this.imageWidth = imageWidth;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return galleryAttributes.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return galleryAttributes.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            imageView = new ImageView(context);
        } else {
            imageView = (ImageView) convertView;
        }

        Picasso.with(context).load(galleryAttributes.get(position).get("Link")).placeholder(R.drawable.loadingimage).into(imageView);
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setLayoutParams(new GridView.LayoutParams(imageWidth,imageWidth));
        return imageView;
    }
}

0 个答案:

没有答案