Android GridView加载重复的图像和文本(使用EndlessScrollListener)

Android GridView加载重复的图像和文本(使用EndlessScrollListener),android,scroll,android-asynctask,android-gridview,Android,Scroll,Android Asynctask,Android Gridview,我有一个自定义的gridVIew,其中有一个ImageView和一个TextView,并且我已经将gridVIew设置为ItShow2列。下面是custom_grid_layout.xml的代码 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/widget44" android:layout_width="wrap_content" android:layou

我有一个自定义的gridVIew,其中有一个ImageView和一个TextView,并且我已经将gridVIew设置为ItShow2列。下面是custom_grid_layout.xml的代码

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

  • 它第一次从服务器加载图像并显示正确的图像和文本,因为我已经在我的项目中实现了EndlessCrollListner类
  • 在第一个itration im从服务器加载12个图像时,当我向下滚动gridView以结束时,它会发送第二个请求,从服务器加载12个以上的图像和文本
  • 在这里,实际问题开始加载相同的图像和文本
  • 请看一下我庞大的代码,告诉我在哪里出错
公营家庭推广活动{ 静态最终字符串URL=“”

静态最终字符串KEY\u ITEM=“Book”//父节点
静态最终字符串键\u BOOKAUTHOR=“book\u author”;
静态最终字符串键\u BOOKRATING=“BOOKRATING”;
静态最终字符串键\u BOOKID=“BOOKID”;
静态最终字符串键\u BOOKDESC=“bookscription”;
静态最终字符串键\u BOOKDATEPUBLISHED=“DatePublished”;
静态最终字符串键\u BOOKTITLE=“BOOKTITLE”;
静态最终字符串键\u BOOKCODE=“BOOKCODE”;
静态最终字符串键\u BOOKIMAGE=“BOOKIMAGE”;
静态最终字符串KEY\u ITEM\u BOOKs\u LIMIT=“Result”//父节点
静态最终字符串键\u项\u总计\u BOOKS=“TotalBooks”;
静态ArrayList BookTitle=null;
静态ArrayList BookRating=null;
静态ArrayList BookDescription=null;
静态ArrayList BookCoverPhotos=null;
静态ArrayList BookAuther=null;
静态ArrayList BookIDs=null;
静态ArrayList BookCode=null;
静态ArrayList BookPublishDate=null;
静态ArrayList ImageByte=null;
静态ArrayList bitmapArray=null;
静态int initialIndex=12;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.home_活动);
gridView=(gridView)findViewById(R.id.gridView);
setOnScrollListener(新的endlesscrollListener());
如果(BookTitle==null){
BookTitle=新的ArrayList();
BookRating=新建ArrayList();
BookDescription=新建ArrayList();
BookIDs=newarraylist();
BookCode=newarraylist();
BookCoverPhotos=新的ArrayList();
BookAuther=newarraylist();
BookPublishDate=新的ArrayList();
ImageByte=新的ArrayList();
bitmapArray=新的ArrayList();
新建UIThread().execute(URL,initialIndex+“”);
//Log.i(“如果”,书名+”);
}否则{
//Log.i(“其他”,书名+”);
ImageAdapter adapter2=新的ImageAdapter(getBaseContext(),
法案);
设置适配器(适配器2);
}
我正在使用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);
    }
}
私有类UIThread扩展异步任务{
进行对话进行对话;
ImageAdapter=新的ImageAdapter(getBaseContext(),act);
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog=progressDialog.show(getParent(),
“正在从服务器缓存书籍…”,
“这可能需要几秒钟。\n请稍候…”);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串URL=params[0];
int initialIndex=Integer.valueOf(参数[1]);
Log.i(“params”,params[1]+”);
XMLParser=新的XMLParser();
String XMLString=parser.getXmlFromUrl\u FeaturedBooks(URL,
初始索引);
Home.initialIndex=Home.initialIndex+12;
Log.i(“Home.initialIndex”,Home.initialIndex+”);
Document doc=parser.getdoElement(XMLString);
NodeList nlBooksLimit=doc
.getElementsByTagName(关键项、书籍、限制);
元素eLimit=(元素)nlBooksLimit.item(0);
String totalBooks=parser.getValue(eLimit,KEY\u ITEM\u TOTAL\u BOOKS);
Log.i(“totalBooks”,totalBooks+”);
NodeList nl=doc.getElementsByTagName(键项);
//循环通过所有项目节点
位图imageNotFound=BitmapFactory.decodeResource(getResources(),
R.可绘制。默认封面照片);
对于(int i=0;iprivate 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);
    }
}
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;
        }
    }
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;
}
    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;
}