listview只能显示3个JSON解析出来的item数据
发布时间:2018-02-01 来源:查字典编辑
摘要:调试看了发现Arraylis的size只有3。是不是因为这个原因?我的listview上一次只能显示3条item。而且从其他页面回到到该界面...
调试看了发现Arraylis的size只有3。是不是因为这个原因?我的listview上一次只能显示3条item。而且从其他页面回到到该界面才会刷新listview,但刷新出来的也是重复的3条数据。。。。
package com.chason.igo.fragment;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.VolleyError;
import com.chason.igo.R;
import com.chason.igo.utils.Constans;
import com.chason.igo.utils.NewsItemInfo;
import com.example.lib_lyn.HttpUtils;
import com.example.lib_lyn.volley.VolleyLisener;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
/**
* Created by chason on 2017/6/12.
*/
public class MainFragment extends Fragment {
private View mLayout;
public ArrayList< String > pic;
public ArrayList< NewsItemInfo > datalist = new ArrayList< NewsItemInfo >();
private ListView lv_main;
private MyListView adapter;
private NewsItemInfo newsItemInfo;
private ImageLoader imageLoader = ImageLoader.getInstance();
private DisplayImageOptions options;
private TextView tv_title;
private TextView tv_summary;
private TextView tv_price;
private ImageView iv_img;
public MainFragment() {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, null);
lv_main = (ListView) view.findViewById(R.id.lv_main);
initoption();
adapter = new MyListView();
lv_main.setAdapter(adapter);
new MyAsyn().execute(Constans.URL.FAVORITE_URL);
return view;
}
class MyAsyn extends AsyncTask< String, Void, Void > implements VolleyLisener {
@Override
protected Void doInBackground(String... params) {
HttpUtils.getVolley(params[0], this);
return null;
}
@Override
protected void onPostExecute(Void result) {
adapter.notifyDataSetChanged();
super.onPostExecute(result);
}
@Override
public void onResponse(String response) {
parseJson(response);
}
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity(), "数据解析失败", Toast.LENGTH_SHORT).show();
}
}
private void parseJson(String response) {
try {
JSONObject json = new JSONObject(response);
JSONArray jsonArray = json.getJSONArray("goodlist");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String title = jsonObject.getString("product");
String str = jsonObject.getString("short_title");
int price = jsonObject.getInt("price");
JSONArray picArray = jsonObject.getJSONArray("images");
pic = new ArrayList< String >();
for (int j = 0; j < picArray.length(); j++) {
JSONObject jsonpic = picArray.getJSONObject(i);
String string = jsonpic.getString("image");
pic.add(string);
}
newsItemInfo = new NewsItemInfo(title, str, price, pic);
datalist.add(newsItemInfo);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
/*图片初始化*/
private void initoption() {
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher)
.showImageForEmptyUri(R.drawable.ic_launcher)
.showImageOnFail(R.drawable.ic_launcher)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.build();
}
class MyListView extends BaseAdapter {
@Override
public int getCount() {
return datalist.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
newsItemInfo = datalist.get(position);
View inflate = LayoutInflater.from(getActivity()).inflate(R.layout.list_item, null);
tv_title = (TextView) inflate.findViewById(R.id.tv_title1);
tv_summary = (TextView) inflate.findViewById(R.id.tv_summary);
tv_price = (TextView) inflate.findViewById(R.id.tv_price);
iv_img = (ImageView) inflate.findViewById(R.id.iv_img);
imageLoader.displayImage(newsItemInfo.pic.get(0), iv_img, options);
tv_title.setText(""+newsItemInfo.title);
tv_summary.setText(""+newsItemInfo.str);
tv_price.setText(""+newsItemInfo.price);
adapter.notifyDataSetChanged();
return inflate;
}
}
}
附上demo地址http://download.csdn.net/detail/aa931667248/9872696
回复讨论(解决方案)
你json数据的多少是看 for (int i = 0; i < jsonArray.length(); i++) {
这行代码中的jsonarray的长度
你的设置为读取goodlist标签的数据集合,那你就要去看看你的要表现的数据是否都是在goodlist下的了 你json数据的多少是看
for (int i = 0; i < jsonArray.length(); i++) {
这行代码中的jsonarray的长度
你的设置为读取goodlist标签的数据集合,那你就要去看看你的要表现的数据是否都是在goodlist下的了
是在goodlist里的。我尝试改变size大小,然后就报错显示数组越界,大小只有3 数组越界的话那就是你的Mylistview 或者adapter有哪里出了问题,只能给到你这个方向了 数组越界的话那就是你的Mylistview 或者adapter有哪里出了问题,只能给到你这个方向了
谢谢,已经发现问题了。是JSON图片数组里的for语句写错了。把i改回j就可以了。
JSONObject jsonPic = picArray.getJSONObject(j);