[英]Android GridView Redraw issues
我創建了一個應用程序,該應用程序允許用戶拍照並上傳到Web服務器。 然后,該圖像在活動中的網格視圖上變得可見
我雖然一切正常,但是我拍攝的照片越多,我注意到的問題就越多
當用戶開始滾動時,gridview中的圖像似乎正在重繪自身,從而有效地再次向用戶顯示相同的圖像(並非總是以相同的順序)
我讀過其他人在類似的東西上苦苦掙扎的帖子,但是這些修復似乎對我不起作用
預先感謝您提供的所有幫助
這是我的gridview活動
package com.example.alex.jsonparsegridview;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends Activity {
GridView gridView;
static final String[] MOBILE_OS = new String[]{
"Android", "iOS", "Windows", "Blackberry"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new JSONParse().execute();
TextView tv = (TextView)findViewById(R.id.footerText);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent myIntent = new Intent(MainActivity.this, CameraActivity.class);
myIntent.putExtra("dir", "BS"); //Optional parameters
MainActivity.this.startActivity(myIntent);
}
});
}
private class JSONParse extends AsyncTask<String, String, JSONArray> {
private ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Getting Data ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected JSONArray doInBackground(String... args) {
JSONParser jParser = new JSONParser();
// Getting JSON from URL
String url = "http://www.500kgiveaway.co.uk/getimagesmob.php";
JSONArray json = jParser.getJSONFromUrl(url);
return json;
}
@Override
protected void onPostExecute(JSONArray json) {
pDialog.dismiss();
// Getting JSON Array from URL
JSONArray android = json;
//copied from onCreate
gridView = (GridView) findViewById(R.id.gridView1);
gridView.setAdapter(new ImageAdapter(MainActivity.this, android));
gridView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
Toast.makeText(
getApplicationContext(),
((TextView) v.findViewById(R.id.grid_item_label))
.getText(), Toast.LENGTH_SHORT).show();
}
});
//End Copy
}
}
}
這是我的圖片適配器(畢加索定制)
package com.example.alex.jsonparsegridview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ImageAdapter extends BaseAdapter {
private Context context;
private JSONArray android;
private String TAG_PATH = "path";
ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();
public ImageAdapter(Context context, JSONArray android) {
this.context = context;
this.android = android;
}
public View getView(int position, View convertView, ViewGroup parent) {
View gridView = null;
try {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
JSONObject c = android.getJSONObject(position);
// Storing JSON item in a Variable
String path = c.getString(TAG_PATH);
// Adding value HashMap key => value
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_PATH, path);
oslist.add(map);
gridView = new View(context);
// get layout from mobile.xml
gridView = inflater.inflate(R.layout.mobile, null);
// set value into textview
TextView textView = (TextView) gridView
.findViewById(R.id.grid_item_label);
textView.setText(path.toString());
// set image based on selected text
ImageView imageView = (ImageView) gridView
.findViewById(R.id.grid_item_image);
Picasso.with(context).load("http://www.500kgiveaway.co.uk/" + path).resize(400,400).into(imageView);
} else {
gridView = (View) convertView;
}
} catch (JSONException e) {
e.printStackTrace();
}
return gridView;
}
@Override
public int getCount() {
return android.length();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
問題出在您的getView()
函數中。 GridView
通過將視圖傳遞給convertView
getView()
來重用視圖。 但是,這些視圖不一定已經加載了正確的圖像,它們是以前用於在不同位置顯示網格中不同單元格的視圖。 因此,如果convertView
不為null,則convertView
使視圖膨脹的麻煩,但是仍然需要將圖像加載到其中。
重新排列您的代碼,如下所示:
public View getView(int position, View convertView, ViewGroup parent) {
View gridView = null;
try {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
gridView = new View(context);
// get layout from mobile.xml
gridView = inflater.inflate(R.layout.mobile, null);
}
else
{
gridView = convertView;
}
JSONObject c = android.getJSONObject(position);
// Storing JSON item in a Variable
String path = c.getString(TAG_PATH);
// set value into textview
TextView textView = (TextView) gridView
.findViewById(R.id.grid_item_label);
textView.setText(path.toString());
// set image based on selected text
ImageView imageView = (ImageView) gridView
.findViewById(R.id.grid_item_image);
Picasso.with(context).load("http://www.500kgiveaway.co.uk/" + path).resize(400,400).into(imageView);
// Adding value HashMap key => value
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_PATH, path);
// TODO: add some checks so you don't add it if it's already in the list?
oslist.add(map);
} catch (JSONException e) {
e.printStackTrace();
}
return gridView;
}
我不知道關於HashMap
程序邏輯是什么,但是您可能只想在第一次加載圖像時將其添加到oslist
。 請注意,您不能為此使用(convertView == null)
測試,因為convertView可能已用於完全不同的圖像。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.