AsyncTask不使用BaseAdpter创建GridView

时间:2017-11-19 09:15:36

标签: java android gridview android-asynctask baseadapter

我对Android开发的新手有很基本的知识,无论我到目前为止实现的是使用这个网站或youtube视频我被困在AsyncTask中(早先我在创建视图上使用.get()和它工作正常,但UI被阻止,直到任务完成。要避免UI阻塞我建议从OnCreateView()函数中删除.get()函数现在删除此im后无法从AsyncTask获取任何数据)。我做到了但现在我无法创造视图我做了很多研究,但无法获得这种力量

这是我的代码请帮助如何从这个

创建视图

OnCreateView(): -

    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View GView = inflater.inflate(R.layout.fragment_dashboard, container, false);
    progressBarHolder = (FrameLayout) GView.findViewById(R.id.progressBarHolder);
    GridView gridView = (GridView) GView.findViewById(R.id.gridView);
    //Toast.makeText(getActivity(),Json_String,Toast.LENGTH_LONG).show();
    String finalResult = null;
    try{
        finalResult = String.valueOf(new JSONTask().execute("https://www.example.in/android_api/dashboard_data",JsonData()));
        Toast.makeText(getActivity(),Json_String,Toast.LENGTH_LONG).show();
        JSONObject parentObject = null;
        parentObject = new JSONObject(finalResult);
        if(((String) parentObject.names().get(0)).matches("error")){
            JSONObject jObj = parentObject.getJSONObject("error");
            errorThrow(jObj.getString("Description"));
        } else if(((String) parentObject.names().get(0)).matches("success")){
            JSONObject jObj = parentObject.getJSONObject("success");
            JSONArray arrajson = jObj.getJSONArray("data");
            String arrayCount = Integer.toString(arrajson.length());
            String[] type = new String[arrajson.length()];
            Integer[] count = new Integer[arrajson.length()];
            for (int i=0; i<arrajson.length();i++){
                JSONObject jsonObject = arrajson.getJSONObject(i);
                type[i] = jsonObject.getString("type");
                count[i] = jsonObject.getInt("count");
            }
            CustomAdpter customAdpter = new CustomAdpter(DashboardFragment.this,type,count);
            gridView.setAdapter(customAdpter);
            return GView;
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return GView;
}

基本适配器代码: -

    class CustomAdpter extends BaseAdapter {

    String[] type;
    Integer[] count;
    public CustomAdpter(DashboardFragment dashboardFragment, String[] type, Integer[] count){
        this.count = count;
        this.type = type;
    }
    @Override
    public int getCount() {
        return type.length;
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

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

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        view = getLayoutInflater().inflate(R.layout.grid_single_itme,null);
        TextView textView = (TextView) view.findViewById(R.id.TextView1);
        TextView textView1 = (TextView) view.findViewById(R.id.textView2);
        textView.setText(String.valueOf(count[i]));
        textView1.setText(type[i]);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(),"Booking Item Clicked",Toast.LENGTH_LONG).show();
            }
        });
        return view;
    }
}

AsyncTask代码: -

    public class JSONTask extends AsyncTask<String,String,String> {
    private ProgressDialog mProgressDialog;

    int progress;
    public JSONTask(){
        mProgressDialog = new ProgressDialog(getContext());
        mProgressDialog.setMax(100);
        mProgressDialog.setProgress(0);
    }

    @Override
    protected void onPreExecute(){
        mProgressDialog = ProgressDialog.show(getContext(),"Loading","Loading Data...",true,false);
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        final String finalJson = params[1];
        String json = finalJson;
        try{
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(5000);
            connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            connection.setRequestProperty("A-APK-API", "******");
            connection.setRequestProperty("Authorization", "Basic **:**");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestMethod("POST");
            connection.connect();

            OutputStream stream = connection.getOutputStream();
            OutputStreamWriter streams =  new OutputStreamWriter(stream, "UTF-8");
            stream.write(json.getBytes("UTF-8"));
            stream.close();

            reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));

            StringBuffer buffer = new StringBuffer();

            String line = "";
            while((line = reader.readLine()) != null){
                buffer.append(line);
            }
            return buffer.toString();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(connection != null){
                connection.disconnect();
            }
            try {
                if(reader != null) {
                    reader.close();
                }
            } catch (IOException e){
                e.printStackTrace();
            }
        }
        return null;
    }
    protected void onPostExecute(String result){
        super.onPostExecute(result);
        Json_String = result;
        Toast.makeText(getContext(),result,Toast.LENGTH_LONG).show();
        mProgressDialog.dismiss();
    }
}

请在这里帮助我

2 个答案:

答案 0 :(得分:1)

当你不使用.get()时,你无法从asynctask获得结果。

所以改变那个陈述。只启动asynctask。

然后将该行之后的所有代码放在AsyncTask的onPostExecute()中。

多数人。

答案 1 :(得分:0)

您应该改变创建适配器和附加的方式 你应该这样做

1.首先通过AsyncTaskdoInBackGround方法获取List,ArrayList等中的数据

  1. 然后在onPostExecute方法上检索数据并创建适配器并将其附加到您的视图
  2. 在获取数据时,您可以显示一些ProgressDialog
  3. 如果您的AsyncTask在其他单独的班级中,请使用界面从AsyncTask班级获取数据 看看这个https://stackoverflow.com/a/47373959/8197737