Recyclerview+JSON+Fragment+Android



我试图通过从JSON中获得的对象数组列表,并传递到Android Studio中的另一个片段。

这是我想要接收数组的类

   @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_car, container, false);
        new AsyncTaskParseJson().execute();

        mRecyclerView = (RecyclerView) view.findViewById(R.id.rv_list);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.addOnItemTouchListener(new RecyclerViewTouchListener( getActivity(), mRecyclerView, this ));
        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(llm);
        CarAdapter adapter = new CarAdapter(getActivity(), mList);
        mRecyclerView.setAdapter( adapter );
        return view;
    }

这是创建数组的类:

   public class AsyncTaskParseJson extends AsyncTask<String, String, String> {
        final String TAG = "AsyncTaskParseJson.java";
        String yourJsonStringUrl = "http://marciowelben.servidorturbo.net/getjson.php";
        JSONArray dataJsonArr = null;
        @Override
        protected void onPreExecute() {}
        @Override
        protected String doInBackground(String... arg0) {
            try {
                JsonParser jParser = new JsonParser();
                JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);
                dataJsonArr = json.getJSONArray("emp_info");
                for (int i = 0; i < dataJsonArr.length(); i++) {
                    JSONObject c = dataJsonArr.getJSONObject(i);
                    // Storing each json item in variable
                    String firstname = c.getString("employee name");
                    String lastname = c.getString("employee no");
                    Car d = new Car(firstname, lastname, R.mipmap.ic_launcher );
                    listAux.add(d);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            mList = listAux;
            return null;
        }
    }

所以我只想用这个数组填充我的Recyclerview

由于在等待数据返回之前首先添加适配器,因此必须调用notifyDataSetChanged(),以便适配器在完成解析后重新绘制列表。完成此操作的另一种方法是等待结果返回,然后设置适配器。见下文

public class MainActivity extends AppCompatActivity {
 private static final String TAG = "RecyclerViewExample";
    private List<FeedItem> feedItemList = new ArrayList<FeedItem>();
    private RecyclerView mRecyclerView;
    private MyRecyclerAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /* Initialize recyclerview */
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        /*Downloading data from below url*/
        final String url = "http://javatechig.com/api/get_category_posts/?dev=1&slug=android";
        new AsyncHttpTask().execute(url);
    }
    public class AsyncHttpTask extends AsyncTask<String, Void, Integer> {
        @Override
        protected void onPreExecute() {
            setProgressBarIndeterminateVisibility(true);
        }
        @Override
        protected Integer doInBackground(String... params) {
            InputStream inputStream = null;
            Integer result = 0;
            HttpURLConnection urlConnection = null;
            try {
                /* forming th java.net.URL object */
                URL url = new URL(params[0]);
                urlConnection = (HttpURLConnection) url.openConnection();
                /* for Get request */
                urlConnection.setRequestMethod("GET");
                int statusCode = urlConnection.getResponseCode();
                /* 200 represents HTTP OK */
                if (statusCode ==  200) {
                    BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while ((line = r.readLine()) != null) {
                        response.append(line);
                    }
                    parseResult(response.toString());
                    result = 1; // Successful
                }else{
                    result = 0; //"Failed to fetch data!";
                }
            } catch (Exception e) {
                Log.d(TAG, e.getLocalizedMessage());
            }
            return result; //"Failed to fetch data!";
        }
        @Override
        protected void onPostExecute(Integer result) {
            setProgressBarIndeterminateVisibility(false);
            /* Download complete. Lets update UI */
            if (result == 1) {
                adapter = new MyRecyclerAdapter(MainActivity.this, feedItemList);
                mRecyclerView.setAdapter(adapter);
            } else {
                Log.e(TAG, "Failed to fetch data!");
            }
        }
    }
    private void parseResult(String result) {
        try {
            JSONObject response = new JSONObject(result);
            JSONArray posts = response.optJSONArray("posts");
            /*Initialize array if null*/
            if (null == feedItemList) {
                feedItemList = new ArrayList<FeedItem>();
            }
            for (int i = 0; i < posts.length(); i++) {
                JSONObject post = posts.optJSONObject(i);
                FeedItem item = new FeedItem();
                item.setTitle(post.optString("title"));
                item.setThumbnail(post.optString("thumbnail"));
                feedItemList.add(item);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}
1.Design Recycleview in layout
  <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="10dp"
        android:layout_weight="1"
        />
2.add dependency in gradle.build
 compile 'com.android.support:recyclerview-v7:23.1.1'
3.Write the code in Activity
public class DoctorInformationActivity extends AppCompatActivity {
    String URL="YOUR URL";
    JSONArray Cities=null;
    ArrayList<DocotorInformation> doctorList =new ArrayList<DocotorInformation>();
    Sqlitedatabase sql;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.doctor_information_listview);
        sql=new Sqlitedatabase(getApplicationContext());
        ConnectivityManager connectivityManager
                = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        if(activeNetworkInfo != null && activeNetworkInfo.isConnected())
        {
            Toast.makeText(getApplicationContext()," connect",Toast.LENGTH_LONG).show();
            new JSONAsyncTask().execute();
        }
        else
        {
            ArrayList<DocotorInformation> listdata=sql.getAllContacts();
            doctorList=listdata;
            RecyclerView  recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

            DoctorAdapter mAdapter = new DoctorAdapter(getApplicationContext(), doctorList);
            recyclerView.setAdapter(mAdapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
            Toast.makeText(getApplicationContext(),"Not connect",Toast.LENGTH_LONG).show();
        }

    }
    private class JSONAsyncTask extends AsyncTask<String, Void, JSONArray> {
        private ProgressDialog dialog = new ProgressDialog(DoctorInformationActivity.this);
        @Override
        protected void onPreExecute() {
            this.dialog.setMessage("Please wait");
            this.dialog.show();
        }
        @Override
        protected JSONArray doInBackground(String... urls) {
            try {
                //------------------>>
                HttpGet httppost = new HttpGet(URL);
                HttpClient httpclient = new DefaultHttpClient();
                HttpResponse response = httpclient.execute(httppost);
                // StatusLine stat = response.getStatusLine();
                int status = response.getStatusLine().getStatusCode();
                if (status == 200) {
                    HttpEntity entity = response.getEntity();
                    String data = EntityUtils.toString(entity);

                    JSONObject jsono = new JSONObject(data);
                    Cities = jsono.getJSONArray("SearchDoctorsData");
                    return Cities;
                }

            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return Cities;
        }
        protected void onPostExecute(JSONArray result) {
            dialog.dismiss();
            System.out.println(result);
            for (int i = 0; i < result.length(); i++) {
                JSONObject c = null;
                try {
                    DocotorInformation doc=new DocotorInformation();
                    c = result.getJSONObject(i);
                    doc.setName(c.getString("DoctorName"));
                    doc.setNumber(c.getString("Mobile"));
                    doctorList.add(doc);
                    sql.insertData(doc);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            RecyclerView  recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        DoctorAdapter mAdapter = new DoctorAdapter(getApplicationContext(), doctorList);
        recyclerView.setAdapter(mAdapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

    }
}
}

public class DoctorAdapter extends RecyclerView.Adapter<DoctorAdapter.ViewHolder> {
private ArrayList<DocotorInformation> countries;
Context con;
public DoctorAdapter(Context c ,ArrayList<DocotorInformation> countries) {
    this.con=c;
        this.countries = countries;
        }
@Override
public DoctorAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.doctor_textviews, viewGroup, false);
        return new ViewHolder(view);
        }
@Override
public void onBindViewHolder(DoctorAdapter.ViewHolder viewHolder, int i) {
    viewHolder.name.setText(countries.get(i).getName());
        viewHolder.number.setText(countries.get(i).getNumber());
        }
@Override
public int getItemCount() {
        return countries.size();
        }
public class ViewHolder extends RecyclerView.ViewHolder{
    private TextView name,number;
    public ViewHolder(View view) {
        super(view);
        name = (TextView)view.findViewById(R.id.name);
        number = (TextView)view.findViewById(R.id.numebr);
    }
}
}

最新更新