如何在网格视图的底部添加进度条页脚?

时间:2014-10-22 06:08:29

标签: android footer android-gridview android-progressbar android-lazyloading

如何在网格视图底部添加进度条页脚,当我加载更多网格视图项时可以看到它,并在加载所请求数据时隐藏进度条?我需要知道如何在我的xml文件上实现它的UI,它可以应用于所有屏幕尺寸。下面是我的网格视图的代码:

<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:numColumns="auto_fit"
    android:gravity="center"
    android:stretchMode="columnWidth"
    android:background="#ffb4d9"> 
</GridView>

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类,这是请求数据的地方:

public class Utils {

private Context context;
private Activity activity;
private ProgressDialog progress;

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;


    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;
}

}

最后,我的适配器类:

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;
}

}

2 个答案:

答案 0 :(得分:0)

尝试将ProgressDialog放在底部,如下所示:

//In your asynctask

ProgressDialog progressDialog;

//In onPreExecute

progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Fetching images");
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(false);
progressDialog.getWindow().setGravity(Gravity.BOTTOM);
progressDialog.show();

//In onPostExecute
progressDialog.dismiss();

希望它有所帮助。

答案 1 :(得分:0)

请尝试这种方式,希望这有助于您解决问题。

而不是在你的布局中只使用GridView而是将垂直LinearLayout作为父级并在GridView之后放置ProgressBar,默认情况下给GridView.now赋予权重1,ProgressBar为GONE所以当你需要在代码中显示进度条时可见,而当没有时则为GONE需要更长时间。

<强> activity_grid_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <GridView
        android:id="@+id/grid_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:numColumns="auto_fit"
        android:gravity="center"
        android:stretchMode="columnWidth"
        android:background="#ffb4d9">
    </GridView>

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone" />

</LinearLayout>

以下是如何为您的服务器响应实现接口并将数据更新到您的活动的代码。

<强> WebServicesCallListener.java

public interface WebServicesCallListener {
    public void onResponse(ArrayList<HashMap<String,String>> response);
}

这里使用上面的接口

修改Utils类

<强> Utils.java

public class Utils {

    private Context context;

    public Utils(){}

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

    public void getDataFromServer(final int urlPageIndex,final WebServicesCallListener listener){
        new AsyncTask<Void,Void,ArrayList<HashMap<String,String>>>(){
            @Override
            protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {
                JsonParser jParser = new JsonParser();
                JSONObject json = jParser.getJSONFromUrl(AppConstant.JSON_URL + urlPageIndex);
                JSONArray dataJsonArr;
                try {
                    dataJsonArr = json.getJSONArray(AppConstant.JSON_ARRAY_NAME);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                ArrayList<HashMap<String, String>> galleryAttributes = new ArrayList<HashMap<String, String>>();
                galleryAttributes.ensureCapacity(dataJsonArr.length());
                for (int i = 0; i < dataJsonArr.length(); i++) {
                    JSONObject c = dataJsonArr.getJSONObject(i);
                    HashMap<String, String>() map = new HashMap<String, String>();
                    map.put("Link", c.getString("Link"));
                    galleryAttributes.add(map);
                }
                return galleryAttributes;
            }

            @Override
            protected void onPostExecute(ArrayList<HashMap<String, String>> data) {
                super.onPostExecute(data);
                listener.onResponse(data);

            }
        }.execute();
    }
    @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;
    }
}

此处更改Utils实施

<强> GridViewActivity.java

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>>();

        utils.getDataFromServer(new WebServicesCallListener() {
            @Override
            public void onResponse(ArrayList<HashMap<String, String>> response) {
                galleryAttributes.addAll(response);
                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) {
        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) {
        Log.e("onScrollStateChanged: ", "" + scrollState);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
        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++;
            utils.getDataFromServer(urlPageIndex,new WebServicesCallListener() {
                @Override
                public void onResponse(ArrayList<HashMap<String, String>> response) {
                    galleryAttributes.addAll(response);
                    adapter.notifyDataSetChanged();
                    hasRequestedMore = false;
                }
            });
        }
    }
}