2012-12-21 36 views
3

我有一個自定義的gridVIew在其中有一個ImageView和一個TextView,並且我已經將gridView設置爲它顯示2 coloumns。這裏是custom_grid_layout.xmlGridView加載重複的圖像和文本(使用EndlessScrollListener)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/widget44" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="center_horizontal" 
android:orientation="vertical" > 

<ImageView 
    android:id="@+id/imgBookCover" 
    android:layout_width="88dp" 
    android:layout_height="102dp" 
    android:adjustViewBounds="true" 
    android:background="@drawable/rounded_image_borders" 
    android:paddingLeft="5dp" 
    android:paddingRight="5dp" 
    android:src="@drawable/book5" > 
</ImageView> 

<TextView 
    android:id="@+id/txt_BookTitle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:gravity="center_horizontal" 
    android:lines="1" 
    android:text="TextView" 
    android:textColor="@color/White" 
    android:textColorHighlight="#656565" > 
</TextView> 

的代碼,這裏是gridview.xml

<GridView 
    android:id="@+id/gridview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentBottom="true" 
    android:layout_below="@+id/Rel_Spinner" 
    android:layout_centerHorizontal="true" 
    android:gravity="center" 
    android:numColumns="auto_fit" 
    android:stretchMode="columnWidth" > 
</GridView> 
  • 其裝載從服務器的圖像,並顯示正確的圖像和文本的佈局這是我第一次在我的項目中實現了EndlessScrollListner類。
  • 在第一次從服務器加載12張圖片時,當我向下滾動gridView結束時,發送第二個請求,從服務器加載12張圖片和文本。
  • 這裏的實際問題開始加載相同的圖像和文字。
  • 請看看我龐大的代碼,並告訴我在哪裏我想要的錯誤。

public class Home extends Activity最後一個String URL =「http://www.shiaislamiclibrary.com/requesthandler.ashx」;

static final String KEY_ITEM = "Book"; // parent node 
static final String KEY_BOOKAUTHOR = "book_author"; 
static final String KEY_BOOKRATING = "BookRating"; 
static final String KEY_BOOKID = "BookID"; 
static final String KEY_BOOKDESC = "BookDescription"; 
static final String KEY_BOOKDATEPUBLISHED = "DatePublished"; 
static final String KEY_BOOKTITLE = "BookTitle"; 
static final String KEY_BOOKCODE = "BookCode"; 
static final String KEY_BOOKIMAGE = "BookImage"; 
static final String KEY_ITEM_BOOKs_LIMIT = "Result"; // parent node 
static final String KEY_ITEM_TOTAL_BOOKS = "TotalBooks"; 

    static ArrayList<String> BookTitle = null; 
static ArrayList<Integer> BookRating = null; 
static ArrayList<String> BookDescription = null; 
static ArrayList<String> BookCoverPhotos = null; 
static ArrayList<String> BookAuther = null; 
static ArrayList<String> BookIDs = null; 
static ArrayList<String> BookCode = null; 
static ArrayList<String> BookPublishDate = null; 
static ArrayList<String> ImageByte = null; 
static ArrayList<Bitmap> bitmapArray = null; 
static int initialIndex = 12; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
setContentView(R.layout.home_activity); 
gridView = (GridView) findViewById(R.id.gridview); 
gridView.setOnScrollListener(new EndlessScrollListener()); 
if (BookTitle == null) { 
       BookTitle = new ArrayList<String>(); 
       BookRating = new ArrayList<Integer>(); 
       BookDescription = new ArrayList<String>(); 
       BookIDs = new ArrayList<String>(); 
       BookCode = new ArrayList<String>(); 
       BookCoverPhotos = new ArrayList<String>(); 
       BookAuther = new ArrayList<String>(); 
       BookPublishDate = new ArrayList<String>(); 
       ImageByte = new ArrayList<String>(); 
       bitmapArray = new ArrayList<Bitmap>(); 
       new UIThread().execute(URL, initialIndex + ""); 
       // Log.i("If", BookTitle + ""); 
      } else { 

       // Log.i("else", BookTitle + ""); 
       ImageAdapter adapter2 = new ImageAdapter(getBaseContext(), 
         act); 
       gridView.setAdapter(adapter2); 

      } 

我使用AsynkTaks從服務器下載圖像。這裏是代碼

private class UIThread extends AsyncTask<String, Integer, String> { 

    ProgressDialog progressDialog; 
    ImageAdapter adapter = new ImageAdapter(getBaseContext(), act); 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     progressDialog = ProgressDialog.show(getParent(), 
       "Acumlating Books from server...", 
       "This may Take a few seconds.\nPlease Wait..."); 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     String URL = params[0]; 
     int initialIndex = Integer.valueOf(params[1]); 
     Log.i("params", params[1] + ""); 

     XMLParser parser = new XMLParser(); 
     String XMLString = parser.getXmlFromUrl_FeaturedBooks(URL, 
       initialIndex); 

     Home.initialIndex = Home.initialIndex + 12; 
     Log.i("Home.initialIndex", Home.initialIndex + ""); 

     Document doc = parser.getDomElement(XMLString); 
     NodeList nlBooksLimit = doc 
       .getElementsByTagName(KEY_ITEM_BOOKs_LIMIT); 
     Element eLimit = (Element) nlBooksLimit.item(0); 

     String totalBooks = parser.getValue(eLimit, KEY_ITEM_TOTAL_BOOKS); 
     Log.i("totalBooks", totalBooks + ""); 
     NodeList nl = doc.getElementsByTagName(KEY_ITEM); 

     // looping through all item nodes <item> 

     Bitmap imageNotFound = BitmapFactory.decodeResource(getResources(), 
       R.drawable.defaultcoverphoto); 

     for (int i = 0; i < nl.getLength(); i++) { 

      Element e = (Element) nl.item(i); 

      try { 
       BookRating.add(Integer.valueOf(parser.getValue(e, 
         KEY_BOOKRATING))); 
       // Log.i("Rating Try", BookRating.get(i) + ""); 

      } catch (Exception e2) { 
       BookRating.add(0); 
       // Log.i("Rating Catch", BookRating + ""); 
      } 

      BookDescription.add(parser.getValue(e, KEY_BOOKDESC)); 
      BookTitle.add(parser.getValue(e, KEY_BOOKTITLE)); 
      BookCoverPhotos.add("http://shiaislamicbooks.com/books_Snaps/" 
        + parser.getValue(e, KEY_BOOKCODE) + "/1_thumb.jpg"); 
      BookAuther.add(parser.getValue(e, KEY_BOOKAUTHOR)); 
      BookPublishDate.add(parser.getValue(e, KEY_BOOKDATEPUBLISHED)); 
      BookIDs.add(parser.getValue(e, KEY_BOOKID)); 
      BookCode.add(parser.getValue(e, KEY_BOOKCODE)); 
      // Log.i("URLs & Desc", BookCoverPhotos.toString()); 

      try { 
       bookImageURL = new URL(BookCoverPhotos.get(i)); 
      } catch (MalformedURLException e1) { 
       e1.printStackTrace(); 
       // Log.i("URL", "ERROR at image position" + i + ""); 
      } 

      try { 
       bitMapImage = BitmapFactory.decodeStream(bookImageURL 
         .openConnection().getInputStream()); 
       bitmapArray.add(bitMapImage); 
       publishProgress(i + 1); 

      } catch (IOException e2) { 
       e2.printStackTrace(); 
       bitmapArray.add(imageNotFound); 
       // Log.i("File Not Found", bookImageURL + ""); 
      } 

     } 

     Log.i("Book Title", BookTitle + ""); 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     progressDialog.setMessage(values[0] 
       + " Book(s) found \nPlease wait..."); 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     progressDialog.dismiss(); 
     gridView.setAdapter(adapter); 
    } 
} 

這裏是EndlessScrollListner.java代碼。當滾動到達gridView的底部時,它會發送請求以再次斷開下載。

private class EndlessScrollListener implements OnScrollListener { 

    private int visibleThreshold = 0; 
    private int currentPage = 0; 
    private int previousTotal = 0; 
    private boolean loading = true; 

    public EndlessScrollListener() { 
    } 

    public EndlessScrollListener(int visibleThreshold) { 
     this.visibleThreshold = visibleThreshold; 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 
     if (loading) { 
      if (totalItemCount > previousTotal) { 
       loading = false; 
       previousTotal = totalItemCount; 
       currentPage++; 
      } 
     } 
     if (!loading 
       && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { 
      // I load the next page of gigs using a background task, 
      // but you can call any function here. 
      new UIThread().execute(URL, Home.initialIndex + ""); 
      Log.i("Reached", "End"); 
      Log.i("Home.initialIndex", Home.initialIndex + ""); 
      loading = true; 
     } 
    } 

這裏有2張照片,讓你更清楚我的問題。 enter image description here enter image description here

回答

0

雖然很晚,但我碰到了同樣的問題。它的發生是因爲適配器的方法getView。 在你的ImageAdapter中,如果getView函數重用已經創建的視圖,那麼這可能是圖像重複的原因。如果代碼如下所示,則應該像第二個代碼段那樣更改以下載來自加載更多的新圖像。

Snippet 1

public View getView(int position, View v, ViewGroup parent) { 
    ImageView imageview; 
    if(v == null) 
    { 
     imageview = new ImageView(mcontext); 
     imageview.setLayoutParams(new GridView.LayoutParams(250,250)); 
     imageview.setPadding(0,0,10,10); 
     imageview.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     new DownloadImageTask(imageview).execute(arr.get(position).imageUrl); 
    } 
    else 
     imageview = (ImageView) v; 

    return imageview; 
} 

Snippet 2

public View getView(int position, View v, ViewGroup parent) { 

    ImageView imageview; 
    if(v == null) 
    { 
     imageview = new ImageView(mcontext); 
     imageview.setLayoutParams(new GridView.LayoutParams(250,250)); 
     imageview.setPadding(0,0,10,10); 
     imageview.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    } 
    else 
     imageview = (ImageView) v; 
    new DownloadImageTask(imageview).execute(arr.get(position).imageUrl); 
    return imageview; 
} 

或者完全可能創造一個新的觀點,但那麼你可能需要自己來處理gridView/listViewvirtualizationreusability