简体   繁体   中英

How can I add a progress bar footer at the bottom of my grid view?

How can I add a progress bar footer at the bottom of my grid view that will be visible when I load more grid view items, and hide the progress bar when the loading of requested data are done? I need to know how to implement its UI on my xml file which can be applied on all screen sizes. below, is my code for my grid view:

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

This is my Utils class, this is where the data are requested:

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

}

And finally, my adapter class :

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

}

Try positioning the ProgressDialog in bottom like this:

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

Hope it helps.

Try this way,hope this will help you to solve your problem.

Instead of taken only GridView in you layout take vertical LinearLayout as parent and put ProgressBar after GridView,given weight 1 to GridView.now by default ProgressBar is GONE so when you required to show Progressbar just VISIBLE in you code and GONE when no longer required.

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>

Here is code to how implement interface for your server response and update data to your activity.

WebServicesCallListener.java

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

Here modify Utils class using above interface

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

Here change Utils implementation

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM