gpt4 book ai didi

java - Android GridView 重绘问题

转载 作者:行者123 更新时间:2023-11-30 02:10:13 25 4
gpt4 key购买 nike

我创建了一个允许用户拍照并上传到网络服务器的应用程序。然后该图像在 Activity 中的 GridView 中变得可见

我虽然一切正常,但是我拍的照片越多,我发现的问题就越多

当用户开始滚动时,gridview 中的图像似乎正在重新绘制自己,有效地再次向用户显示相同的图像(并不总是以相同的顺序)

我读过其他帖子,其中有人为类似的事情而苦苦挣扎,但这些修复似乎对我不起作用

GridView Redraw Problems

提前感谢所有帮助

这是我的 gridview Activity

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





}
}
}

这是我的图像适配器(使用 picasso 定制)

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 通过将 View 传递给 convertView 中的 getView() 来重用 View 。然而,这些 View 不一定已经加载了正确的图像,它们是以前用于在不同位置显示网格中不同单元格的 View 。因此,如果 convertView 不为 null,它可以让您不必膨胀 View ,但您仍然必须将图像加载到其中。

像这样重新安排你的代码:

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 可能已用于完全不同的图像。

关于java - Android GridView 重绘问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30219030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com