Android GridView加载重复的图像和文本(使用EndlessScrollListener)
我有一个自定义的gridVIew,其中有一个ImageView和一个TextView,并且我已经将gridVIew设置为ItShow2列。下面是custom_grid_layout.xml的代码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
<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个以上的图像和文本
- 在这里,实际问题开始加载相同的图像和文本
- 请看一下我庞大的代码,告诉我在哪里出错
静态最终字符串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;
}