2017-07-08 6 views
0

Retrofit2を初めて使用していて、配列でURLを解析しようとしましたが、オブジェクトとして解析してこのメ​​ッセージを受け取ります。正確にどこに問題があるのか​​本当に分かりません。私はここでは、このチュートリアルhttps://www.learn2crack.com/2016/02/recyclerview-json-parsing.htmlRetrofit2は、配列を取得していますが、recyclerviewでオブジェクトとして解析しています

を追ってきた

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

は私の活動で

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); 
} 

ゲッター/セッター

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プロトコルを調べる必要はありません。サーバー開発者は "同じクラス"を定義するだけです。

関連する問題