3

ImageView と TextView を含むカスタム gridView があり、2 つの列を表示するように gridView を設定しました。これが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個の画像とテキストをロードする2番目のリクエストが送信されます。
  • ここで、実際の問題が同じ画像とテキストの読み込みを開始します。
  • 私のかさばるコードを見て、私が間違いを犯している場所を教えてください。

public class Home extends Activity { static final 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);

            }

サーバーから画像をダウンロードするためにAsyncTaksを使用しています。ここにコードがあります

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枚の写真があります。 ここに画像の説明を入力 ここに画像の説明を入力

4

1 に答える 1