Java Android GridView ArrayAdapter图像通过截击切换滚动
因此,我有一个用于gridview的ArrayAdapter,它在从StringRequest获取图像位置后填充NetworkImageView。当我在网格中滚动时,每个项目的图像都会切换好几次,然后再选择正确的图像 我怀疑问题在于图像在StringRequest之后由imageLoader填充,并且网格项正在被重用,但是我认为NetworkImageView取消了以前的图像请求,这将阻止这种行为。 下面是我正在使用的代码-任何帮助都将不胜感激Java Android GridView ArrayAdapter图像通过截击切换滚动,java,android,android-gridview,android-volley,Java,Android,Android Gridview,Android Volley,因此,我有一个用于gridview的ArrayAdapter,它在从StringRequest获取图像位置后填充NetworkImageView。当我在网格中滚动时,每个项目的图像都会切换好几次,然后再选择正确的图像 我怀疑问题在于图像在StringRequest之后由imageLoader填充,并且网格项正在被重用,但是我认为NetworkImageView取消了以前的图像请求,这将阻止这种行为。 下面是我正在使用的代码-任何帮助都将不胜感激 @Override public View get
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final ViewHolder holder;
View view = convertView;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null) {
view = inflater.inflate(R.layout.gridrowlayout, parent, false);
holder = new ViewHolder();
assert view != null;
holder.textView = (TextView) view.findViewById(R.id.label);
holder.networkImageView = (MNetworkImageView) view.findViewById(R.id.icon);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
MyObject myObject = myObjects.get(position);
String url = null;
try {
url = getUrl(myObject);
} catch (EncoderException e) {
e.printStackTrace();
}
holder.networkImageView.setDefaultImageResId(R.drawable.loading);
holder.networkImageView.setErrorImageResId(R.drawable.no_image_available);
holder.textView.setText(myObject.getName() + "\n " + myObject.getYear());
if (MyApplication.getInstance().isNetworkAvailable()) {
StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String json) {
try {
Resp resp = gson.fromJson(json, Resp.class);
String tbUrl = resp.getPoster();
holder.networkImageView.setImageUrl(tbUrl, imageLoader);
} catch (JsonSyntaxException e) {
Log.i(ImageAdapter.TAG, "status failed");
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.e("Error: ", error.getMessage());
}
});
MyApplication.getInstance().addToRequestQueue(stringRequest, ImageAdapter.TAG);
}
return view;
}
@覆盖
公共视图getView(最终整型位置、视图转换视图、最终视图组父视图){
最终持票人;
视图=转换视图;
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
如果(视图==null){
视图=充气机。充气(R.layout.gridrowlayout,父级,false);
holder=新的ViewHolder();
断言视图!=null;
holder.textView=(textView)view.findViewById(R.id.label);
holder.networkImageView=(MNetworkImageView)view.findViewById(R.id.icon);
视图.设置标签(支架);
}否则{
holder=(ViewHolder)view.getTag();
}
MyObject MyObject=myObjects.get(位置);
字符串url=null;
试一试{
url=getUrl(myObject);
}捕获(e){
e、 printStackTrace();
}
holder.networkImageView.setDefaultImageResId(R.drawable.loading);
holder.networkImageView.setErrorImageResId(R.drawable.无可用图像);
holder.textView.setText(myObject.getName()+“\n”+myObject.getYear());
if(MyApplication.getInstance().isNetworkAvailable()){
StringRequest StringRequest=新的StringRequest(url,new Response.Listener()){
@凌驾
公共void onResponse(字符串json){
试一试{
Resp Resp=gson.fromJson(json,Resp.class);
字符串tbUrl=resp.getPoster();
holder.networkImageView.setImageUrl(tbUrl,imageLoader);
}捕获(JsonSyntaxException e){
Log.i(ImageAdapter.TAG,“状态失败”);
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
e(“Error:,Error.getMessage());
}
});
MyApplication.getInstance().addToRequestQueue(stringRequest,ImageAdapter.TAG);
}
返回视图;
}
更改设计模式,首先下载10个图像URL,然后调用notifydatasetchanged()。您通过发出两个请求来加载,我认为这对于gridview不是一个好主意,您必须稍微更改它,以便用户体验一次加载延迟。