2012-10-15 37 views
3

我正在研究具有圖像GridView的應用程序,但GridView中的最後一項是一個將更多項目加載到Grid中的按鈕。但是我面臨着一個奇怪的問題,那就是Button顯示了某個時間,有時它並不是特別的,當我在GridView上快速上下滾動時。我認爲這是因爲回收問題,但我不知道如何解決它。Android - GridView中的不同項目沒有顯示

這裏是我的代碼: -

public class ButtonGridAdapter extends BaseAdapter implements OnCheckedChangeListener, OnClickListener { 


    private ArrayList<String> thumbUrls; 
    private ArrayList<String> mainUrls; 
    private LayoutInflater layoutInflater; 
    private Context context; 
    private Intent intent; 
    private ArrayList<String> positions = new ArrayList<String>(); 
    private static ArrayList<String> urlsToUpload = new ArrayList<String>(); 
    private int width; 

    public ButtonGridAdapter(Context context, ArrayList<String> thumbUrls, ArrayList<String> mainUrls, String clicked) 
    { 
     this.context = context; 
     this.thumbUrls = thumbUrls; 
     this.mainUrls = mainUrls; 
     intent = new Intent(context, GalleryView.class); 
     this.layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     DisplayMetrics displaymetrics = new DisplayMetrics(); 
     ((Activity) context).getWindow().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
     this.width = displaymetrics.widthPixels; 
     System.out.println(width+" width"); 
    } 

    @Override 
    public int getCount() { 
     return thumbUrls.size()+1; 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return thumbUrls.get(arg0); 
    } 

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

    public static class ViewHolder 
    { 
     ImageView mainImage; 
     CheckBox checkBox; 
     Button button; 
    } 

    public static class ButtonHolder 
    { 

    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ViewHolder holder; 
     if(row==null || row.getTag().equals("button")) 
     { 
       row = layoutInflater.inflate(R.layout.griditem, parent, false); 
       holder = new ViewHolder(); 
       holder.mainImage = (ImageView)row.findViewById(R.id.itemgrid); 
       holder.checkBox = (CheckBox)row.findViewById(R.id.itemselected); 
       holder.button = null; 
       row.setTag(holder); 
     } 
     else 
     { 
      holder = (ViewHolder)row.getTag(); 
     } 

     if(position==thumbUrls.size()) 
     { 
      int width = row.getWidth(); 
      int height = row.getHeight()-70; 
      row = layoutInflater.inflate(R.layout.mybutton, parent, false); 
      holder.button = (Button)row.findViewById(R.id.gridbutton); 
      holder.button.setText("Load More"); 
      LayoutParams params = holder.button.getLayoutParams(); 
      params.height = height; 
      params.width = width; 
      holder.button.requestLayout(); 
      holder.button.setOnClickListener(this); 
      System.out.println("Called"); 
      row.setTag("button"); 
      return row; 
     } 
     else 
     { 
      setImageSize(holder.mainImage); 
      System.out.println(position); 
      holder.mainImage.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        intent.putExtra("position", position); 
        intent.putStringArrayListExtra("MainUrls", mainUrls); 
        intent.putStringArrayListExtra("Thumbnails", thumbUrls); 
        context.startActivity(intent); 
       } 
      }); 

      holder.checkBox.setOnCheckedChangeListener(null); 
      holder.checkBox.setTag(position); 

      holder.checkBox.setChecked(positions.contains(thumbUrls.get(position))); 
      holder.checkBox.setOnCheckedChangeListener(this); 

      UrlImageViewHelper.setUrlDrawable(holder.mainImage, thumbUrls.get(position), R.drawable.extras_load); 
      return row; 
     } 


    } 

    private void setImageSize(ImageView imageView) { 
     LayoutParams params = imageView.getLayoutParams(); 
     int leftWidth = width - 80; 
     params.width = leftWidth/3; 
     params.height = leftWidth/3; 
     imageView.requestLayout(); 
    } 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if(isChecked) 
     { 
      positions.add(thumbUrls.get((Integer)buttonView.getTag())); 
      urlsToUpload.add(mainUrls.get((Integer)buttonView.getTag())); 
     } 

     else 
     { 
      positions.remove(thumbUrls.get((Integer)buttonView.getTag())); 
      urlsToUpload.remove(mainUrls.get((Integer)buttonView.getTag())); 
     } 
    } 

    public static ArrayList<String> getUrlsToUpload() 
    { 
     return urlsToUpload; 
    } 

    @Override 
    public void onClick(View v) { 
     if(v.getId()==R.id.gridbutton) 
     { 
      InstagramImpl.getInstance().fetchMorePhotos(); 
     } 

    } 
} 

任何幫助將是真的很感激。

謝謝。

+0

我沒有看到你的'getView'像我的其他答案。 –

+0

@Varundroid可以告訴我如何添加查看更多按鈕GridView的每個部分? – Erum

回答

0

我從我的其他答案完整getView方法。簡單的你首先檢查位置。如果它是最後一項(加載更多按鈕)立即返回佈局。

private final Media special = new Media("-1", "", "", "", ""); 


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

     list = array; 
     mediaType = type; 
     this.context = context; 

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


    }  



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

       RelativeLayout item; 
       ViewHolder holder; 
//this part check it's the last item. -1 is my special item id in contructor. 
       if(list.get(position).getId().equals("-1")) { 

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

       if(convertView == null || convertView.getTag().toString().equals(MORE_BUTTON)) { 

        Context context = parent.getContext(); 
        item = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.item_with_icon_vertical, null); 
        holder = new ViewHolder(); 
        holder.thumbnail = (ImageView) item.findViewById(R.id.iv_icon_media); 

        item.setTag(holder); 

       } else { 

        item = (RelativeLayout) convertView; 
        holder = (ViewHolder) item.getTag(); 
       } 
      } 
// set data. 
    holder.thumbnail.setBitmap(...) 

    return item; 
0

也許你可以試試delete row==nullholder = (ViewHolder)row.getTag();這是因爲回收問題,你可以先試試,但會影響效率。另一件事我想說,position==thumbUrls.size();?也許它是position==thumbUrls.size()-1;。哦,這是我的觀點,我幫助它工作。

+1

刪除將完全殺死回收。這不僅會影響效率,還會減緩它的爬行速度。此外,位置可以等於thumbUrls.size,因爲getCount返回大小+1。 – Geobits

+0

不是吉姆,這不是最佳實踐。 – Varundroid