3

我有一个自定义的 gridVIew,其中包含一个 ImageView 和一个 TextView,并且我已将 gridView 设置为它显示 2 个列。这是 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>
  • 它从服务器加载图像并首次显示正确的图像和文本,因为我已经在我的项目中实现了 EndlessScrollListner 类。
  • 在第一次迭代中,我从服务器加载 12 个图像,当我向下滚动 gridView 以结束时,它发送第二个请求以从服务器加载 12 个更多图像和文本。
  • 在这里,实际问题开始加载相同的图像和文本。
  • 请查看我庞大的代码并告诉我在哪里出现错误。

公共类首页扩展活动{静态最终字符串网址=“ 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;
        }
    }

这里有两张图片让你更清楚我的问题。 在此处输入图像描述 在此处输入图像描述

4

1 回答 1

0

虽然很晚,但我也遇到了同样的问题。它的发生是因为适配器的getView方法。在您的ImageAdapter中,如果该getView函数重用已创建的视图,那么这可能是您的图像重复的原因。如果代码如下所示,那么它应该像第二个代码片段一样进行更改,以下载来自 load more 的新图像。

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

或者可能完全创建一个新视图,但是您可能需要自己处理virtualization/ 。reusabilitygridViewlistView

于 2015-01-19T16:55:38.253 回答