【问题标题】:Recyclerview+JSON+Fragment+AndroidRecyclerview+JSON+Fragment+Android
【发布时间】:2015-06-07 03:51:19
【问题描述】:

我正在尝试传递一个带有从 JSON 获得的对象的 Arraylist,并传递给 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。

【问题讨论】:

    标签: java android fragment android-recyclerview


    【解决方案1】:

    由于您在等待数据返回之前首先添加适配器,因此您必须调用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();
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:
      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);
          }
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        相关资源
        最近更新 更多