麻烦老师看下为什么没法显示ListView

麻烦老师看下为什么没法显示ListView

Activity中:

package com.example.felix.homeworkapp;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.widget.ListView;
import android.widget.Toast;

import com.example.felix.homeworkapp.Adapter.GridAdapter1;
import com.example.felix.homeworkapp.Adapter.MenuAdapter1;
import com.example.felix.homeworkapp.Info.MenuInfo;
import com.example.felix.homeworkapp.Info.MenuResult;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MenuActivity extends AppCompatActivity {

    private ListView menuListView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        menuListView = findViewById(R.id.mainFragment_listView);
        //LayoutInflater layoutInflater= (LayoutInflater) getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);
    }

    public class MenuAsyncTask extends AsyncTask<Void,Integer, String>{

        @Override
        protected void onPreExecute() {
            Toast.makeText(MenuActivity.this,"开始准备获取数据",Toast.LENGTH_LONG).show();
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(Void... voids) {
            return request("http://www.imooc.com/api/shopping?type=11");
        }

        private String request(String s) {
            try {
                URL url=new URL(s);
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                connection.setConnectTimeout(30*1000);
                connection.setRequestMethod("GET");
                connection.connect();
                int reponseCode=connection.getResponseCode();
                String reponseMessage=connection.getResponseMessage();

                if(reponseCode==HttpURLConnection.HTTP_OK){
                    InputStream inputStream=connection.getInputStream();
                    Bitmap bitmap= BitmapFactory.decodeStream(inputStream);
                }else{
                    Toast.makeText(MenuActivity.this,"ERROR",Toast.LENGTH_LONG).show();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String s) {
            MenuResult menuResult=new MenuResult();
            try {
                JSONObject jsonObject=new JSONObject();
                JSONArray dataArray=jsonObject.getJSONArray("data");
                int status=jsonObject.getInt("status");
                menuResult.setmStatus(status);

                List<MenuInfo> menuInfoList=new ArrayList<>();
                for(int i=0;i<dataArray.length();i++){
                    MenuInfo menuInfo=new MenuInfo();
                    JSONObject js= (JSONObject) dataArray.get(i);
                    menuInfo.setId(js.getInt("id"));
                    menuInfo.setName(js.getInt("name"));
                    menuInfo.setImg(js.getString("img"));
                    menuInfo.setAction(js.getInt("action"));
                    menuInfo.setCount(js.getInt("count"));
                    menuInfo.setPrice(js.getInt("price"));
                    menuInfoList.add(menuInfo);
                }
                menuResult.setmDataInfoList(menuInfoList);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            MenuAdapter1 menuAdapter1=new MenuAdapter1(menuResult.getmDataInfoList(),MenuActivity.this);
            menuListView.setAdapter(menuAdapter1);
            super.onPostExecute(s);
        }
    }

}

Adapter中:

package com.example.felix.homeworkapp.Adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.felix.homeworkapp.Info.MenuInfo;
import com.example.felix.homeworkapp.R;

import java.util.ArrayList;
import java.util.List;

public class MenuAdapter1 extends BaseAdapter {
    List<MenuInfo> menuInfoList=new ArrayList<>();
    private Context context;

    public MenuAdapter1(List<MenuInfo> menuInfoList, Context context) {
        this.menuInfoList = menuInfoList;
        this.context = context;
    }

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

    @Override
    public Object getItem(int i) {
        return menuInfoList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder=new ViewHolder();
        if(view==null){
            view=View.inflate(context, R.layout.item_fragment_main,null);
            viewHolder.img_dish=view.findViewById(R.id.item_fragment_main_imageView);
            viewHolder.tv_dish_name=view.findViewById(R.id.item_fragment_main_textView);
            view.setTag(viewHolder);
        }else {
            view= (View) view.getTag();
        }
        MenuInfo menuInfo=menuInfoList.get(i);
        //viewHolder.img_dish.setImageBitmap(menuInfo.getImg());
        viewHolder.tv_dish_name.setText(menuInfo.getName());
        return view;
    }
    public class ViewHolder {
        ImageView img_dish;
        TextView tv_dish_name;
        //TextView tv_dish_name;
    }
}


以及顺便请老师看下

viewHolder.img_dish.setImageBitmap(menuInfo.getImg());

get方法中是String这里应该怎么进行格式转换,谢谢老师

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

数据获取有如下问题:

MenuAsyncTask类中,doInBackground()方法返回的值将被当做onPostExecute()方法的参数传递进去,你的代码中doInBackground()方法返回的request()方法的返回值,而request没有正确返回请求的数据。

1)如果获取的数据,你参考如下使用循环读取服务器数据并返回

 String str = null;
        InputStream in = null;
        try {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(3*1000);
            conn.connect();
            if (conn.getResponseCode()==HttpURLConnection.HTTP_OK){
                in = conn.getInputStream();
                int len = -1;
                byte[]by = new byte[4*1024];
                StringBuffer buffer = new StringBuffer();
                while((len=in.read(by))!=-1){
                    buffer.append(new String(by,0,len));
                }
                str = new String(buffer);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (in!=null){
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return str;


  • Felixxx 提问者 #1
    请问下老师 by 这个参数是用来做什么的
    2018-12-28 13:06:18
  • irista23 回复 提问者 Felixxx #2
    用byte[]数组作为每次读取的数据缓冲区
    2018-12-28 13:10:15
irista23 2018-12-28 13:03:21

viewHolder.img_dish.setImageBitmap()参数里需要传入的是一个Bitmap,你可以直接设置doInBackground()方法返回的是Bitmap,这样就可以把获取的图片传递给onPostExecute()方法参数,然后在onPostExecute()方法中通过viewHolder.img_dish.setImageBitmap(Bitmap)设置显示

  • 提问者 Felixxx #1
    可以直接设置doInBackground()方法返回的是Bitmap 老师请问具体应该怎么写
    2018-12-28 13:32:05
  • irista23 回复 提问者 Felixxx #2
    如果是获取图片,doInBackground()方法你写的过程没有问题,需要把返回值类型和request()方法返回类型都改成Bitmap,并且在request()方法里返回bitmap
    2018-12-28 13:35:24
  • 提问者 Felixxx 回复 irista23 #3
    那老师我可以在doInBackground()方法中既获取str和Bitmap吗
    2018-12-28 13:43:01
提问者 Felixxx 2018-12-27 23:54:32

我在onCreate方法下添加了

MenuAsyncTask mTask=new MenuAsyncTask();
mTask.execute();

但好像还是不能正常显示网页传来的菜品名称

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Android网络操作与数据存储2018版
  • 参与学习           人
  • 提交作业       307    份
  • 解答问题       1613    个

本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师