2017-07-08 31 views
0

我是Retrofit2的新手,嘗試使用數組解析URL,但它試圖將其解析爲對象,所以我得到此消息。真的不知道問題出在哪裏。Retrofit2,獲取數組,但解析爲recyclerview中的對象

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ 

我一直在關注這個教程https://www.learn2crack.com/2016/02/recyclerview-json-parsing.html

這裏是我的活動

public class WordActivity extends AppCompatActivity { 
private ListView listView; 
private TextView textView; 
private RecyclerView recyclerView; 
private ArrayList<WordRepo> data; 
private WordRecyclerAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.word_info_layout); 
    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar); 
    setSupportActionBar(myToolbar); 
    getSupportActionBar().setTitle(""); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    myToolbar.setTitle(Html.fromHtml("<font color='#272d85'>Svenska slangord </font>")); 

    //textView = (TextView) findViewById(R.id.textView); 
    //listView = (ListView) findViewById(R.id.listView); 



    Bundle bundle = this.getIntent().getExtras(); 
    if (bundle != null) { 

     if (bundle.containsKey("posID")) { 
      int posid = bundle.getInt("posID"); 
      getRetro(posid + 1); 
     } 
     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 
    } 
} 

public void getRetro(int categoryID) { 

    WordInterface client = ApiClient.getClient().create(WordInterface.class); 
    Call<JSONResponse> call = client.getJSON(categoryID); 
    call.enqueue(new Callback<JSONResponse>() { 

     @Override 
     public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) { 
      recyclerView = (RecyclerView) findViewById(R.id.recycler_view_words); 
      recyclerView.setHasFixedSize(true); 
      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
      recyclerView.setLayoutManager(layoutManager); 

      JSONResponse jsonResponse = response.body(); 
      data = new ArrayList<>(Arrays.asList(jsonResponse.getList())); 
      adapter = new WordRecyclerAdapter(data); 
      recyclerView.setAdapter(adapter); 
     } 

     @Override 
     public void onFailure(Call<JSONResponse> call, Throwable t) { 
      Toast.makeText(WordActivity.this, "error" + t, Toast.LENGTH_LONG).show(); 
     } 

    }); 
} 

我Recycleradapter

public class WordRecyclerAdapter extends 
RecyclerView.Adapter<WordRecyclerAdapter.ViewHolder> { 
private ArrayList<WordRepo> values; 

public WordRecyclerAdapter(ArrayList<WordRepo> values) { 
    this.values = values; 
} 

@Override 
public WordRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View view = LayoutInflater.from(viewGroup.getContext()) 
      .inflate(R.layout.recyclerview_words, viewGroup, false); 
      return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(WordRecyclerAdapter.ViewHolder viewholder, int i) { 
    viewholder.word.setText(values.get(i).getWords()); 
    viewholder.description.setText(values.get(i).getDescription()); 
} 

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

public class ViewHolder extends RecyclerView.ViewHolder { 
    private TextView word, description; 

    public ViewHolder(View view) { 
     super(view); 
     word = (TextView) view.findViewById(R.id.word); 
     description = (TextView) view.findViewById(R.id.word_description); 

    } 
} 

}

在terface

public interface WordInterface { 
@GET("categories/{categoryID}/words") 
Call<JSONResponse> getJSON(@Path("categoryID") int categoryID); 
} 

的getter/setter

public class WordRepo { 
private String name; 
private String description; 

public String getDescription() { 
    return description; 
} 

public String getWords() { 
    return name; 
} 


} 

JSONResponse類

public class JSONResponse { 

private WordRepo[] words; 

public WordRepo[] getList() { 
    return words; 
} 
+0

訪問此鏈接。可以幫助你。 https://stackoverflow.com/a/38351872/6021469。 –

回答

0

你只需要設置針對自己的對象的ArrayList。 我強烈建議您定義您的班級以獲取數據。

在我的情況下,

@Override 
public void onResponse(Call<ResponseRidingLogs> call, Response<ResponseRidingLogs> response) { 
    if(response.body().header.result_code != 0) { 
     // Error handling 
    } else { 
     ResponseRidingLogs responseRidingLogs = response.body(); 
     // I have my own header and body: inside body there is arraylist 
     List<yourClass> = responseRidingLogs.body(); 
     //... 
    } 
    //... 
} 

public class ResponseRidingLogs { 
    public HKRheader header; 
    public List<RidingLog> body; 
} 

您是否添加自己的頭和身體在自己的協議或沒有這並不重要。 如果您使用您的類定義進行JSON通信,則無需查看JSON協議。您只需與服務器開發人員定義「相同的類」。