2015-04-10 3 views
2

У меня есть данные JSON, поступающие корректно с моего сервера, я просто хочу поместить его в следующий массив, но я не уверен, что данные JSON правильно вставляются в ArrayList.Ввод данных JSON в список

Вот массив

private List<ShopInfo> createList(int size) { 
    List<ShopInfo> result = new ArrayList<ShopInfo>(); 
    for (int i = 1; i <= size; i++) { 
     ShopInfo ci = new ShopInfo(); 
     ci.name = TAG_NAME+i; 
     ci.address = TAG_ADDRESS+i; 
     result.add(ci); 
    } 
    return result; 
} 

Мой JSON

{"success":1,"shops":[{"name":"Test_Shop","address":"1 Big Road Dublin"} 

Файл

public class OrderCoffee extends Activity { 

JSONParser jParser = new JSONParser(); 
ArrayList<HashMap<String, String>> shopList; 
private static String url_all_products = "xxxxxxxxxx/ordercoffee.php"; 
// products JSONArray 
JSONArray shops = null; 


// JSON Node names 
private static final String TAG_SUCCESS = "success"; 
private static final String TAG_SHOPS = "shops"; 
private static final String TAG_NAME = "name"; 
private static final String TAG_ADDRESS = "address"; 


//get a list of participating coffee shops in the locality that are using the app 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.order_coffee); 
    new LoadAllProducts().execute(); 
    RecyclerView recList = (RecyclerView) findViewById(R.id.cardList); 
    recList.setHasFixedSize(true); 
    LinearLayoutManager llm = new LinearLayoutManager(this); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 
    recList.setLayoutManager(llm); 
    shopList = new ArrayList<HashMap<String, String>>(); 
    ShopAdapter ca = new ShopAdapter(createList(3)); 
    recList.setAdapter(ca); 

} 


class LoadAllProducts extends AsyncTask<String, String, String> { 


    @Override 
    protected String doInBackground(String... args) { 
     // Building Parameters 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     // getting JSON string from URL 
     JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params); 

     // Check your log cat for JSON reponse 
     Log.d("All Products: ", json.toString()); 

     try { 
      // Checking for SUCCESS TAG 
      int success = json.getInt(TAG_SUCCESS); 

      if (success == 1) { 
       // products found 
       // Getting Array 
       shops = json.getJSONArray(TAG_SHOPS); 

       // looping through All Products 
       for (int i = 0; i < shops.length(); i++) { 
        JSONObject c = shops.getJSONObject(i); 

        // Storing each json item in variable 
        String id = c.getString(TAG_ADDRESS); 
        String name = c.getString(TAG_NAME); 

        // creating new HashMap 
        HashMap<String, String> map = new HashMap<String, String>(); 

        // adding each child node to HashMap key => value 
        map.put(TAG_ADDRESS, id); 
        map.put(TAG_NAME, name); 

        shopList.add(map); 


       } 
      } else { 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 


private List<ShopInfo> createList(int size) { 
    List<ShopInfo> result = new ArrayList<ShopInfo>(); 
    for (int i = 1; i <= size; i++) { 
     ShopInfo ci = new ShopInfo(); 
     ci.name = TAG_NAME+i; 
     ci.address = TAG_ADDRESS+i; 
     result.add(ci); 
    } 
    return result; 
} 
} 

ShopAdapter

package com.example.strobe.coffeetime; 

import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.List; 

/** 
* Created by root on 10/04/15. 
*/ 
public class ShopAdapter extends RecyclerView.Adapter<ShopAdapter.ShopViewHolder> { 

    private List<ShopInfo> shopList; 

    public ShopAdapter(List<ShopInfo> shopList) { 
     this.shopList = shopList; 
    } 


    @Override 
    public int getItemCount() { 
     return shopList.size(); 
    } 

    @Override 
    public void onBindViewHolder(ShopViewHolder shopViewHolder, int i) { 
     ShopInfo ci = shopList.get(i); 
     shopViewHolder.vName.setText(ci.name); 
     shopViewHolder.vAddress.setText(ci.address); 

    } 

    @Override 
    public ShopViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View itemView = LayoutInflater. 
       from(viewGroup.getContext()). 
       inflate(R.layout.card_layout, viewGroup, false); 

     return new ShopViewHolder(itemView); 
    } 

    public static class ShopViewHolder extends RecyclerView.ViewHolder { 

     protected TextView vName; 
     protected TextView vAddress; 


     public ShopViewHolder(View v) { 
      super(v); 
      vName = (TextView) v.findViewById(R.id.name); 
      vAddress = (TextView) v.findViewById(R.id.address); 

     } 
    } 
} 
+0

Что вы имеете в виду * "это, кажется, не входите в массив правильно для меня »*? – Rami

+0

Я не уверен, что способ ввода данных JSON в список result = new ArrayList (); правильно, я не был уверен, как сформулировать вопрос, перефразировать. – Strobes

+0

вы можете добавить этот метод к вашей асинхронной загрузке LoadAllProducts и напечатать свой массив: protected void onPostExecute (результат строки) {Log.d ("shopList", shopList.toString());} –

ответ

1

Вы должны изменить свой OnCreate к этому

private RecyclerView recList; 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.order_coffee); 
    recList = (RecyclerView) findViewById(R.id.cardList); 
    recList.setHasFixedSize(true); 
    recList.setLayoutManager(new LinearLayoutManager(this)); 
    shopList = new ArrayList<HashMap<String, String>>(); 
    new LoadAllProducts().execute(); 
} 

И затем в onPostExecute

protected void onPostExecute(String result) { 
    List<ShopInfo> list = new ArrayList<ShopInfo>(); 
    for (int i = 0; i < shopList.size(); i++) { 
     ShopInfo ci = new ShopInfo(); 
     HashMap<String, String> map = shopList.get(i) 
     ci.name = map.get(TAG_NAME); 
     ci.address = map.get(TAG_ADDRESS); 
     list.add(ci); 
    } 

    ShopAdapter ca = new ShopAdapter(list); 
    recList.setAdapter(ca); 
} 

Если вы не используете shopList для всего, что вы можете удалить его и переместить код для создания списка, который вы передаете адаптер к doInBackground

+0

Я попробую это – Strobes

+0

ok, дайте мне знать, если он работает –

+0

, отредактированный с вашими предложениями, я получил «E/RecyclerView: адаптер не подключен, пропуская макет» http://pastebin.com/Rua0N9LG – Strobes

5

В этой строке кода:

ShopAdapter ca = new ShopAdapter(createList(3)); 

Вы вызываете createList(int size) метод, который возвращает ArrayList с тремя объектами с фиктивными ShopInfo объектов, как это элементы.

В AsyncTask Вы заполняете shopList ArrayList, но вы никогда на самом деле с помощью shopList для чего-либо.

Простой способ разобрать JSON это с Gson библиотеки Google, для разбора JSON.

Im угадать это ваш ShopInfo класс:

public class ShopInfo { 
    String name; 
    String address; 

    public void setName(String n){ 
     name = n; 
    } 

    public void setAddress(String a){ 
     address = a; 
    } 

    public String getName(){ 
     return name; 
    } 

    public String getAddress(){ 
     return address; 
    } 
} 

Создайте новый класс, как показано ниже:

import java.util.List; 
public class ShopInfoList{ 
    List<ShopInfo> shops; 
} 

Внутри вашего метода doInBackground AsyncTask пишут код ниже:

try 
{ 
    HttpURLConnection connection = (HttpURLConnection)new URL(YOUR_URL_WITH_JSON).openConnection(); 
    try 
    { 
     InputStream instream =connection.getInputStream(); 
     BufferedReader breader = new BufferedReader(new InputStreamReader(instream)); 
     ShopInfoList shopList = new Gson().fromJson(breader, ShopInfoList.class); 

     breader.close(); 
    } 
    catch (IOException e) 
    { 
     Log.e("Exception parsing JSON", e); 
    } 
    finally 
    { 
     connection.disconnect(); 
    } 
} 
catch (Exception e) 
{ 
    Log.e("Exception parsing JSON", e); 
} 

Но у вас все еще есть t o обновите свой ShopAdapter, чтобы показать их в списке (RecycleView), вы можете сделать это в методе onPostExecute() для AsyncTask.

Вы можете проверить этот адрес для более детальной информации объяснения о том, как использовать GSONgithub URL

Вот некоторые быстрые направляющие линии:

  1. Ваш адаптер, AsyncTask, Acitvity классы должны быть разделены в разные пакеты, например: util.asynctasks; и util.adapters; somename.activities; , Его легче поддерживать и отлаживать;
  2. Сохраняйте условное обозначение кода.Так как вы программируете на Java использовать эту директиву: https://google-styleguide.googlecode.com/svn/trunk/javaguide.html
  3. При расширении класса, как активность или AsyncTask, что вы не построить это хорошо назвать этот класс WhateverExtendingClassName, например: YourAcitivity. Значит, вы точно знаете, в чем его цель.

Ну вы не хотите использовать GSON я лично считаю, что это печально :(

код ниже, надеюсь, будет работать для вас, некоторые вещи, чтобы иметь в виду:.

  1. Я скопировал свой код, я изменил некоторые из имен переменных, и я добавил код.
  2. Я заметил, где я внес изменения или добавленный код.
  3. Я использую notifyDataSetChanged() метод адаптеров в методе onPostExecute() AsyncTask, вы должны попробовать использовать метод notifyItemInserted (int) 0 notifyItemRemoved (int) notifyItemRemoved (int) для добавления и удаления элементов на основе того, что вы получили от вашего API.

Ниже приведен код для деятельности и AsyncTask:

public class OrderCoffee extends Activity { 

JSONParser jParser = new JSONParser(); 
ArrayList<ShopInfo> shopInfoList; //I changed this 
private static String url_all_products = "xxxxxxxxxx/ordercoffee.php"; 
// products JSONArray 
JSONArray shops = null; 


// JSON Node names 
private static final String TAG_SUCCESS = "success"; 
private static final String TAG_SHOPS = "shops"; 
private static final String TAG_NAME = "name"; 
private static final String TAG_ADDRESS = "address"; 


//get a list of participating coffee shops in the locality that are using the app 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.order_coffee); 
    RecyclerView recList = (RecyclerView) findViewById(R.id.cardList); 
    recList.setHasFixedSize(true); 
    LinearLayoutManager llm = new LinearLayoutManager(this); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 
    recList.setLayoutManager(llm); 
    shopInfoList = new ArrayList<ShopInfo>();//I changed this 
    ShopAdapter shopAdapter = new ShopAdapter(ShopInfoList);//I changed this 
    recList.setAdapter(shopAdapter);//I changed this 

    LoadAllProducts loadAllProducts = new LoadAllProducts(shopAdapter)//I added this 
    loadAllProducts.execute();//I changed this 
} 


class LoadAllProducts extends AsyncTask<String, String, String> { 

    ShopAdapter shopAdapter;//I added this 
    ArrayList<ShopInfo> shopInfoList = new ArrayList<ShopInfo>();//I added this 

    public LoadAllProducts(ShopAdapter shopAdapter)//I added this 
    { 
     this.shopAdapter = shopAdapter;//I added this 
    } 

    @Override 
    protected String doInBackground(String... args) //I changed this{ 
     // Building Parameters 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     // getting JSON string from URL 
     JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params); 

     // Check your log cat for JSON reponse 
     Log.d("All Products: ", json.toString()); 

     try { 
      // Checking for SUCCESS TAG 
      int success = json.getInt(TAG_SUCCESS); 

      if (success == 1) { 
       // products found 
       // Getting Array 
       shops = json.getJSONArray(TAG_SHOPS); 

       // looping through All Products 
       for (int i = 0; i < shops.length(); i++) { 
        JSONObject c = shops.getJSONObject(i); 

        // Storing each json item in variable 
        String id = c.getString(TAG_ADDRESS); 
        String name = c.getString(TAG_NAME); 
        ShopInfo shopInfo = new ShopInfo();//I changed this 
        shopInfo.setId(id);//I changed this 
        shopInfo.setName(name);//I changed this 

        shopInfoList.add(shopInfo);//I changed this 
       } 
      } else { 

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

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result)//I added this{ 
     shopAdapter.setShopList(shopInfoList); //I added this 
     shopAdapter.notifyDataSetChanged(); //I added this 
    } 
} 

И код адаптера:

public class ShopAdapter extends RecyclerView.Adapter<ShopAdapter.ShopViewHolder> { 

    private ArrayList<ShopInfo> shopList;//I added this 

    public ShopAdapter(ArrayList<ShopInfo> shopList)//I added this { 
     this.shopList = shopList;//I added this 
    } 

    public void setShopList(ArrayList<ShopInfo> shopList) 
    { 
     this.shopList = shopList; 
    } 


    @Override 
    public int getItemCount() { 
     return shopList.size(); 
    } 

    @Override 
    public void onBindViewHolder(ShopViewHolder shopViewHolder, int i) { 
     ShopInfo ci = shopList.get(i); 
     shopViewHolder.vName.setText(ci.name); 
     shopViewHolder.vAddress.setText(ci.address); 

    } 

    @Override 
    public ShopViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View itemView = LayoutInflater. 
       from(viewGroup.getContext()). 
       inflate(R.layout.card_layout, viewGroup, false); 

     return new ShopViewHolder(itemView); 
    } 

    public static class ShopViewHolder extends RecyclerView.ViewHolder { 

     protected TextView vName; 
     protected TextView vAddress; 


     public ShopViewHolder(View v) { 
      super(v); 
      vName = (TextView) v.findViewById(R.id.name); 
      vAddress = (TextView) v.findViewById(R.id.address); 

     } 
    } 
} 
+0

Спасибо за ввод, но я сделал много этого проекта с JSON, и я хочу сохранить его согласованным. Хотя в следующий раз мне придется смотреть на GSON как на мой метод.Как обновить recyclerView в методе onPostExecute? – Strobes

+0

Покажите мне код вашего адаптера – Arlind

+0

, проверяя сейчас :) – Strobes

Смежные вопросы