2012-08-14 77 views
3

这是我的代码。当数据不足时它会加载更多的数据。我想当它加载更多数据时,将一个页脚的ProgressBar添加到GridView。怎么做?我在StackOverflow上看到很多问题,但没有答案。如何在GridView的最后一项后添加页脚ProgressBar

public class MainActivity extends Activity { 
    private static final String TAG = "MainActivity"; 
    private final List<Integer> commonImageList = new ArrayList<Integer>(); 
    private int index = 0; 
    private boolean isLoading = false; 
    private static final int NUM = 18; 
    private ImageAdapter adapter; 

    @Override 
    public void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Task task = new Task(mThumbIds, index); 
     task.setOnPostExecuteListener(new OnPostExecuteListener<List<Integer>>() { 
      @Override 
      public void onPostExecute(final List<Integer> result) { 
       System.out.println("RESULT: " + result); 
       if(result.isEmpty()) { 
        return; 
       } 

       // Store it. 
       commonImageList.addAll(result); 

       // Prepare gridView. 
       final GridView gridview = (GridView) findViewById(R.id.gridview); 
       adapter = new ImageAdapter(MainActivity.this, commonImageList); 
       gridview.setAdapter(adapter); 

       gridview.setOnScrollListener(new OnScrollListener() { 
        @Override 
        public void onScrollStateChanged(final AbsListView view, final int scrollState) { 

        } 

        @Override 
        public void onScroll(final AbsListView view, final int firstVisibleItem, 
          final int visibleItemCount, final int totalItemCount) { 
         System.out.println("firstVisibleItem: " + firstVisibleItem); 
         System.out.println("visibleItemCount: " + visibleItemCount); 
         System.out.println("totalItemCount: " + totalItemCount); 

         final boolean loadMore = (firstVisibleItem + visibleItemCount >= totalItemCount); 
         System.out.println("loadMore: " + loadMore); 
         System.out.println("isLoading: " + isLoading); 

         if(loadMore && !isLoading) { 
          // TODO Show footer here. 


          ShowLog.showLogInfo(TAG, "============= LOAD MORE ============="); 
          // Get more images. 
          index = index + NUM; 
          final Task task = new Task(mThumbIds, index); 
          task.setOnPreExecuteListener(new OnPreExecuteListener() { 
           @Override 
           public void onPreExecute() { 
            isLoading = true; 
           } 
          }); 
          task.setOnPostExecuteListener(new OnPostExecuteListener<List<Integer>>() { 
           @Override 
           public void onPostExecute(final List<Integer> result) { 
            System.out.println("RESULT222: " + result); 

            if(result.isEmpty()) { 
             return; 
            } 
            System.out.println("HIEU THONG MINH"); 

            // Update common list. 
            commonImageList.addAll(result); 

            // Update adapter. 
            adapter.notifyDataSetChanged(); 

            isLoading = false; 
           } 
          }); 
          task.execute(); 
         } 
        } 
       }); 
      } 
     }); 
     task.execute(); 

    } 

    private class Task extends AbstractWorkerTask<Void, Void, List<Integer>> { 
     private final Integer []thumbs; 
     private final int index; 

     public Task(final Integer []thumbs, final int index) { 
      this.thumbs = thumbs; 
      this.index = index; 
     } 

     @Override 
     protected List<Integer> doInBackground(final Void... params) { 
      final List<Integer> list = new ArrayList<Integer>(); 
      for(int i = index; i < index + NUM && i < thumbs.length; ++i) { 
       list.add(thumbs[i]); 
      } 
      return list; 
     } 
    } 

    public static class ImageAdapter extends BaseAdapter { 
     private final Context context;    
     private final List<Integer> imageList; 

     public ImageAdapter(final Context c, final List<Integer> imageList) { 
      context = c; 
      this.imageList = imageList; 
     } 

     @Override 
     public int getCount() { 
      return imageList.size(); 
     } 

     @Override 
     public Object getItem(final int position) { 
      return null; 
     } 

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

     // create a new ImageView for each item referenced by the Adapter 
     @Override 
     public View getView(final int position, final View convertView, final ViewGroup parent) { 
      ImageView imageView; 
      if (convertView == null) { // if it's not recycled, initialize some attributes 
       imageView = new ImageView(context); 
       imageView.setLayoutParams(new GridView.LayoutParams(150, 150)); 
       imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
       imageView.setPadding(8, 8, 8, 8); 

      } else { 
       imageView = (ImageView) convertView; 
      } 

      imageView.setImageResource(imageList.get(position)); 
      return imageView; 
     } 
    } 

    // references to our images 
    private static final Integer[] mThumbIds = { 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
    }; 
} 

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:columnWidth="150dp" 
    android:numColumns="3" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center" 
/> 
+1

添加<查看... ...>具有下面的标签=“@ + id/gridview”属性。 – 2012-08-14 09:04:45

+0

不,我的意思是在GridView的最后一项之后的一个View。不在GridView下面。你有没有使用“加载更多”按钮的ListView? – Emerald214 2012-08-14 09:14:06

回答

3

在这里,我没有加负载更多的项目在GridView
1.在最后一个适配器的输入数据的创建一个假物品的逻辑

public class MediaGridAdapter extends BaseAdapter { 

    private ArrayList<Media> list; 
    private final Media special = new Media("-1", "", "", "", ""); 

    public MediaGridAdapter(Context context, int imageID, ArrayList<Media> array, int type) { 

     list = array; 

     if(list != null) { 
      list.add(special); 
     } 
      } 

public void appendDataList(ArrayList<Media> appendedList, boolean isEnd) { //called in postExecute to append new data 

    //remove special element in original list 
    list.remove(list.size() - 1); 
    //append collection of media to list 
    list.addAll(appendedList); 
    //check to add special element 
    if(!isEnd) { 

     list.add(special); 
    } 
} 
} 

2.在getView方法:检查它是否是la st位置(是我们的假项目)为此返回特殊布局(进度条...)。

if(position == (list.size() - 1)) { 

     Context context = parent.getContext(); 
     item = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.item_special_more, null); 
     item.setTag(MORE_BUTTON); 
     return item; 
    } 

onItemClick检查标签的最后一个开始getMoreAsyncTask

if (v.getTag().equals(MediaGridAdapter.MORE_BUTTON)) {  

         GetMoreItems task = new GetMoreItems(); 
         task.execute(url); 
         return; 
        } 
+0

嗨Yul。我试过你的解决方案,但我面临一个非常奇怪的情况。我有一个按钮作为我的GridView中的最后一个项目,但有时它显示在我的GridView的最后一个索引处,有时它不知道为什么?看看我把它作为一个新的问题: - http://stackoverflow.com/questions/12888169/android-different-items-in-gridview-not-showing-up – Varundroid 2012-10-15 01:39:55

0

我发现一个更侵入性的方式来做到这一点,通过采取动态布局的优势,使得项目时可见更改/不见了。为此,我使用了相对布局,但也可能与其他内容一起工作。 这是XML布局:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ProgressBar 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/loader_view" 
    android:visibility="visible" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentStart="true" 
    android:layout_centerHorizontal="true" 
    android:padding="32dp" /> 

<GridView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/grid_view" 
    android:layout_toStartOf="@id/loader_view" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="false" 
    android:layout_above="@+id/loader_view" 
    android:numColumns="@integer/grid_view_column_count" 
    android:scrollbarStyle="insideOverlay" 
    android:scrollbars="none" 
    android:listSelector="@null" 
    android:smoothScrollbar="false"></GridView> 

</RelativeLayout> 

这方面的一些注意事项:

显示进度条在GridView下方,但你必须在XML之前定义它,因为:在android:layout_toStartOf="@id/loader_view"参考GridView。

您可以增加进度条上的填充以使装载区域变大,例如,以匹配网格的行高。

网格视图的android:numColumns="@integer/grid_view_column_count"是一个来自资源的动态值,随时可以对其进行更改。你可以在那里使用一个数字,但是外部效果更好,因为你可以根据屏幕宽度来设置数值。

下面的代码去你的碎片的onCreateView:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.grid_and_loader_view, container, false); 
    GridView gridView = (GridView) view.findViewById(R.id.grid_view); 
    //store a class reference to the loader: 
    _loader = (ProgressBar) view.findViewById(R.id.loader_view); 
    //set up your grid adapter e.g.: 
    //_adapter = new GridImageAdapter(this.getActivity()); 
    //gridView.setAdapter(_adapter); 
    return view; 
} 

您可以启动/从你的片段停止加载方式如下:

public void startLoading() { 
    if(_loader != null) { 
     _loader.setVisibility(View.VISIBLE); 
    } 
} 

public void stopLoading() { 
    if(_loader != null) { 
     _loader.setVisibility(View.GONE); 
    } 
} 

我发现,一个更好的解决方案是为了控制适配器的加载行为,所以我将片段作为可加载接口(可选)形式的引用传递给适配器,并从那里调用上述的启动/停止加载函数。