无法在json的listview中显示图像

时间:2014-12-08 07:52:37

标签: android json listview

可能很多次都是这个问题。 我从服务器获取一些数据并在listview中显示。一切正常,但我在列表视图中显示图像时遇到问题。

这是我的示例代码

public class MainActivity extends ListActivity {

private static String url = null;

private static final String book_name = "b_name";
private static final String book_detail = "b_publisher";
private static final String book_image = "b_image";

ProgressDialog progressDialog;

ListView lv;

String cus_id;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    url = getResources().getString(R.string.url);

    /*----Receiving data from Splash Activity-----*/

    Bundle b = getIntent().getExtras();
    cus_id = b.getString("custom_id");

    new ProgressTask(MainActivity.this).execute();

}

class ProgressTask extends AsyncTask<String, Integer, Boolean> {

    ArrayList<HashMap<String, String>> jsonlist = new ArrayList<HashMap<String, String>>();


    public ProgressTask(ListActivity activity) {
        context = activity;
    }

    private Context context;

    protected void onPreExecute() {

        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setTitle("Processing...");
        progressDialog.setMessage("Please wait...");
        progressDialog.setCancelable(false);
        progressDialog.show();

    }

    @Override
    protected void onProgressUpdate(Integer... values) {

        // set the current progress of the progress dialog
        progressDialog.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(final Boolean success) {

        progressDialog.dismiss();



    }

    protected Boolean doInBackground(final String... args) {

        url = url + "?custom_iid=" + cus_id;

        Log.d("Passing Url", url);

        CustomListAdapter jParser = new CustomListAdapter();

        JSONArray json = jParser.getJSONFromUrl(url);

        if (json != null) {
            for (int i = 0; i < json.length(); i++) {

                try {

                    JSONObject c = json.getJSONObject(i);

                    String b_image = c.getString("b_image");
                    String b_name = c.getString("b_name");
                    String b_detail = c.getString("b_publisher");

                    Log.d("detail", "" + b_image);

                    setBookImageUrl(b_image);
                    setBookName(b_name);
                    setBookDetail(b_detail);


                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;

    }

    public String getBookImageUrl() {

    return book_image;
}

public CharSequence getBookName() {

    return book_name;
}

public CharSequence getBookDetail() {

    return book_detail;
}

public void setBookImageUrl(String imgeUrl) {

    book_image = imgeUrl;
}

public void setBookName(String b_name) {

    book_name = b_name;
}

public void setBookDetail(String b_detail) {

    book_detail = b_detail;
}
}

BookListAdapter类:

public class BookListAdapter extends ArrayAdapter<MainActivity> {

private ArrayList<MainActivity> bookModels;
private Context context;

public BookListAdapter(Context context, int resource,
        ArrayList<MainActivity> bookModels) {
    super(context, resource, bookModels);
    this.bookModels = bookModels;
    this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.row_list_item, null);
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.bookIcon = (ImageView) rowView.findViewById(R.id.icon);
        viewHolder.bookName = (TextView) rowView.findViewById(R.id.b_name);
        viewHolder.bookDetail = (TextView) rowView
                .findViewById(R.id.b_detail);
        rowView.setTag(viewHolder);
    }
    final MainActivity bookModel = bookModels.get(position);
    ViewHolder holder = (ViewHolder) rowView.getTag();
    Picasso.with(context).load(bookModel.getBookImageUrl())
            .into(holder.bookIcon);
    holder.bookName.setText(bookModel.getBookName());
    holder.bookDetail.setText(bookModel.getBookDetail());

    return rowView;
}

@Override
public int getCount() {
    return bookModels.size();
}

static class ViewHolder {
    public ImageView bookIcon;
    public TextView bookName;
    public TextView bookDetail;
}

}

我可以在listview中显示book namebook detail,但图片没有显示..

我正在获得book_image http:\/\/X.X.X.X\/admin\/book_images\/232513pic9.png的价值,如何在该路径列表视图中展示..

3 个答案:

答案 0 :(得分:2)

我认为您需要实现自己的适配器并使用一些库来显示URL中的图像 我的推荐是Picasso

这是实现您自己的适配器的示例

BookListAdapter.java

public class BookListAdapter extends ArrayAdapter<BookModel> {

    private ArrayList<BookModel> bookModels;
    private Context context;

    public BookListAdapter(Context context, int resource, ArrayList<BookModel> bookModels) {
        super(context, resource, bookModels);
        this.bookModels = bookModels;
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;
        ViewHolder viewHolder;
        if (rowView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.book_child_list, parent, false);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.bookIcon = (ImageView) rowView
                    .findViewById(R.id.bookIcon);
            viewHolder.bookName = (TextView) rowView
                    .findViewById(R.id.bookName);
            viewHolder.bookDetail = (TextView) rowView
                    .findViewById(R.id.bookDetail);
            rowView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) rowView.getTag();
        }
        final BookModel bookModel = bookModels.get(position);
        Picasso.with(context).load(bookModel.getBookImageUrl()).into(viewHolder.bookIcon);
        viewHolder.bookName.setText(bookModel.getBookName());
        viewHolder.bookDetail.setText(bookModel.getBookDetail());

        return rowView;
    }

    @Override
    public int getCount() {
        return bookModels.size();
    }

    static class ViewHolder {
        public ImageView bookIcon;
        public TextView bookName;
        public TextView bookDetail;
    }
}

BookModel.java

public class BookModel {

    private String bookName;
    private String bookDetail;
    private String bookImageUrl;

    public BookModel() {
        bookName = "";
        bookDetail = "";
        bookImageUrl = "";
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getBookDetail() {
        return bookDetail;
    }

    public void setBookDetail(String bookDetail) {
        this.bookDetail = bookDetail;
    }

    public String getBookImageUrl() {
        return bookImageUrl;
    }

    public void setBookImageUrl(String bookImageUrl) {
        this.icons = bookImageUrl;
    }

}

其中BookModel类是一个类,您可以在其中包装数据(书名,书籍详细信息,书籍图像)并将其作为列表传递给适配器。 例如:

protected Boolean doInBackground(final String... args) {

    url = url + "?custom_iid=" + cus_id;

    Log.d("Passing Url", url);

    CustomListAdapter jParser = new CustomListAdapter();

    JSONArray json = jParser.getJSONFromUrl(url);
    ArrayList<BookModel> bookModelList = new ArrayList<BookModel>();
    if (json != null) {
        for (int i = 0; i < json.length(); i++) {

            try {
                BookModel bookModel = new BookModel();
                JSONObject c = json.getJSONObject(i);

                String b_image = c.getString("b_image");
                String b_name = c.getString("b_name");
                String b_detail = c.getString("b_publisher");

                Log.d("detail", "" + b_image);

                bookModel.setBookName(b_name);
                bookModel.setBookDetail(b_detail);
                bookModel.setBookImageUrl(b_image);
                bookModelList.add(bookModel);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
    if(bookModelList.size()>0) {
        BookListAdapter bookListAdapter = new BookListAdapter(MainActivity.this, R.id.yourlistview, bookModelList );
    }
    return null;

}

我希望我的回答可以帮到你!

答案 1 :(得分:0)

引用此链接从URL加载图片。 Android Loading Image from URL

答案 2 :(得分:0)

lv.setAdapter(适配器); 使用AQuery lib。 并在自定义适配器中编写此代码:

AQuery aQuery = new AQuery(context);
aQuery.id(your image id).image(your url,true,true);