Je suis nouveau dans la mise à niveau 2 et j'essaie d'obtenir des données de tableau json mais en obtenant null, c'est l'URL pour obtenir les données.
Mais le plus drôle, c'est quand j'essaye de déboguer dans onResponse Je reçois un message de réussite ainsi que des données
response.body
. Quel est le problème ici?
https://xenzet.com/GameCheat/viewgamesjson .php
ceci est des données json
class GameRecyclerViewAdapter extends RecyclerView.Adapter<GameRecyclerViewAdapter.ViewHolder> { private List<Games> mGames; private LayoutInflater mInflater; private ItemClickListener mClickListener; // data is passed into the constructor GameRecyclerViewAdapter(Context context, List<Games> games) { this.mInflater = LayoutInflater.from(context); this.mGames = games; } // inflates the row layout from xml when needed @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.gameitem, parent, false); return new ViewHolder(view); } // binds the data to the TextView in each row @Override public void onBindViewHolder(ViewHolder holder, int position) { Games Game = mGames.get(position); String Gameid = Game.getGameid(); String Gameicon = Game.getGameIcon(); String Gamename = Game.getGamesName(); holder.GameNameTxt.setText(Gamename); Glide.with(holder.GameIconImage.getContext()).load(Game.getGameIcon()).thumbnail(0.1f). placeholder(R.color.colorPrimary).diskCacheStrategy(DiskCacheStrategy.NONE).into(holder.GameIconImage); } // total number of rows @Override public int getItemCount() { return mGames == null ? 0 : mGames.size(); } // stores and recycles views as they are scrolled off screen public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView GameNameTxt; ImageView GameIconImage; ViewHolder(View itemView) { super(itemView); GameNameTxt = itemView.findViewById(R.id.gamename); GameIconImage = itemView.findViewById(R.id.imageView); itemView.setOnClickListener(this); } @Override public void onClick(View view) { if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition()); } } // allows clicks events to be caught void setClickListener(ItemClickListener itemClickListener) { this.mClickListener = itemClickListener; } // parent activity will implement this method to respond to click events public interface ItemClickListener { void onItemClick(View view, int position); } }
c'est la méthode qui essaie d'obtenir des données
public class Games { @SerializedName("gameid") @Expose private String gameid; @SerializedName("gameIcon") @Expose private String gameIcon; @SerializedName("Games_Name") @Expose private String gamesName; public String getGameid() { return gameid; } public void setGameid(String gameid) { this.gameid = gameid; } public String getGameIcon() { return gameIcon; } public void setGameIcon(String gameIcon) { this.gameIcon = gameIcon; } public String getGamesName() { return gamesName; } public void setGamesName(String gamesName) { this.gamesName = gamesName; } // public Games(String Gameid,String Gameicon,String GameName) // { // this.gameid = Gameid; // this.gameIcon = Gameicon; // this.gamesName = GameName; // // } }
ceci est ApiClient
2019-05-27 14:03:43.261 1261-1261/com.example.quizgames E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.quizgames, PID: 1261 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference at com.example.quizgames.GamesActivity$1.onResponse(GamesActivity.java:109) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70) at android.os.Handler.handleCallback(Handler.java:836) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:203) at android.app.ActivityThread.main(ActivityThread.java:6251) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
et Api
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_games); gameslist = new ArrayList<Games>(); RecyclerView recyclerView = findViewById(R.id.recyclerview_gameslist); recyclerView.setLayoutManager(new LinearLayoutManager(this)); fetch_information(); Toast.makeText(getApplicationContext(),"" +gamescounter, Toast.LENGTH_SHORT).show(); adapter = new GameRecyclerViewAdapter(this, gameslist); recyclerView.setAdapter(adapter); adapter.setClickListener((GameRecyclerViewAdapter.ItemClickListener) this); }
et dans OnCreate, j'appelle chercher des informations méthode.
public interface Api { @GET("viewgamesjson.php") Call<List<Games>> GetGames(); }
tente de remplir les données de la liste des jeux dans la vue du recycleur mais échoue car elle est nulle.
c'est logcat
public class ApiClient { public static String Base_URL ; public static Retrofit retrofit; public static Retrofit getApiClient() { if (retrofit == null) { Base_URL ="https://xenzet.com/GameCheat/"; retrofit = new Retrofit.Builder().baseUrl(Base_URL) .addConverterFactory(GsonConverterFactory.create()).build(); } return retrofit; } }
Ceci est des jeux de classe
public void fetch_information() { ApiInterface = ApiClient.getApiClient().create(Api.class); Call<List<Games>> call = ApiInterface.GetGames(); call.enqueue(new Callback<List<Games>>() { @Override public void onResponse(Call<List<Games>> call, Response<List<Games>> response) { if(response.isSuccessful()) { gameslist = response.body(); gamescounter = gameslist.size(); adapter = new GameRecyclerViewAdapter(GamesActivity.this, gameslist); recyclerView.setAdapter(adapter); } } @Override public void onFailure(Call<List<Games>> call, Throwable t) { Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show(); } }); }
Ceci est une vue recycleur
[ { "gameid":"2", "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/counter strike 1.6.png", "Games_Name":"1" }, { "gameid":"3", "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/gta.ico", "Games_Name":"vice city sucjlfsdrgefdsrhag" }, { "gameid":"4", "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/pubg.png", "Games_Name":"pubg" }, { "gameid":"5", "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/doom.png", "Games_Name":"Doom Enternal" }, { "gameid":"6", "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/for.png", "Games_Name":"Fornite" }, { "gameid":"9", "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/dota2.png", "Games_Name":"dota2" } ]
3 Réponses :
Ajoutez des données dans votre adaptateur dans la méthode side onResponse
ajoutez fetch_information ()
dans oncreate
@Override public void onResponse(Call<List<Games>> call, Response<List<Games>> response) { if(response.isSuccessful()) { gameslist = response.body(); adapter = new GameRecyclerViewAdapter(MainActivity.this, gameslist); //change your Activity name here insted of MainActivity recyclerView.setAdapter(adapter); } }
aucun changement, je pense qu'il ne va pas à l'intérieur de la méthode OnRepsonse et OnFailure, le débogage essayé ne va pas à l'intérieur, ne fonctionne que vers le curseur en état de débogage, je suis entré dans la méthode de réponse et il remplit les données là-bas.
n'a pas fonctionné les données ne sont toujours pas trouvées, la liste de jeux est vide.
add gameslist = new ArrayList
je l'ai fait en haut de la classe. toujours pas d'amélioration
Vous avez l'url @Nikunj Paradva, pourquoi n'essayez-vous pas d'obtenir des données et si vous obtenez des résultats, vous pouvez publier tout ce que vous avez fait, si vous le pouvez aussi.
le problème n'est pas pour la réponse, votre liste n'est pas initialisée selon votre journal d'erreurs en question, alors initialisez votre arraylist dans oncreate puis après la passer à l'adaptateur
ne fonctionne pas et après avoir montré toast donne une erreur d'adaptateur d'ensemble de recycleview sur la référence d'objet nulle.
mettre à jour le code de la méthode fetch_information (), et ce qui se trouve sur la ligne 109
n'a pas changé, a également ajouté la classe recyclerview et quelle ligne 109, ne voyant pas le numéro de ligne ici.
dites-moi quelle ligne était 109? J'ai compilé votre code et j'ai obtenu une réponse avec succès.
Le problème est que vous configurez votre adaptateur de liste dans onCreate (), où gameslist
est toujours nul.
return gameslist == null ? 0 : gameslist.size()
Lorsque vous appelez la méthode setAdapter (), le recyclerView demandera à l'adaptateur le nombre d'éléments; et dans getItemCount () je suppose, vous avez quelque chose comme return gameslist.count (). Puisque la liste de jeux est toujours nulle, cela provoque le NPE.
Pour résoudre ce problème, remplacez getItemCount () par quelque chose comme ceci:
adapter = new GameRecyclerViewAdapter(this, gameslist); recyclerView.setAdapter(adapter);
EDIT
J'ai vérifié votre URL (avec Postman), et il semble que le type de contenu de la réponse soit text / html
et non application / json
comme il se doit. Je suppose que la réponse n'est donc pas convertie à l'aide de Gson et que vous vous retrouvez donc avec null.
oui vous avez raison cela résout l'erreur mais les données de réponse sont toujours nulles pourquoi?
Quelqu'un peut-il essayer d'obtenir ces données en utilisant l'URL de retrofit 2.
Je n'ai pas vérifié où vous vous êtes trompé. Mais cette implémentation de code me renvoie une liste contenant 10 données dans la liste.
private void viewGame() { Call<List<ViewGame>> call = APIClient.getInterface().viewgamesjson("https://xenzet.com/GameCheat/viewgamesjson.php"); call.enqueue(new Callback<List<ViewGame>>() { @Override public void onResponse(Call<List<ViewGame>> call, Response<List<ViewGame>> response) { try { Global.dismissProgress(); if (response.isSuccessful() && response.body() != null) { Global.dismissProgress(); Global.printLog("size===", response.body().size() + ""); } else { Global.dismissProgress(); } } catch (Exception e) { e.printStackTrace(); Global.dismissProgress(); } } @Override public void onFailure(Call<List<ViewGame>> call, Throwable t) { Global.dismissProgress(); try { Global.showToast(SplashActivity.this, getString(R.string.something_wrong)); } catch (Exception e) { e.printStackTrace(); } call.cancel(); t.printStackTrace(); } }); }
Voici la classe de modèle:
public class APIClient { static Retrofit retrofit = null; public static String Base_URL = "https://xenzet.com/GameCheat/"; public static APIInterface getInterface() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .readTimeout(60, TimeUnit.SECONDS) .connectTimeout(60, TimeUnit.SECONDS) .addInterceptor(interceptor) .build(); retrofit = new Retrofit.Builder() .baseUrl(Base_URL) .addConverterFactory(GsonConverterFactory.create()) .client(client) .build(); return retrofit.create(APIInterface.class); } }
Voici la classe APiClient:
public class ViewGame { String gameid,gameIcon,Games_Name; public String getGameid() { return gameid; } public void setGameid(String gameid) { this.gameid = gameid; } public String getGameIcon() { return gameIcon; } public void setGameIcon(String gameIcon) { this.gameIcon = gameIcon; } public String getGames_Name() { return Games_Name; } public void setGames_Name(String games_Name) { Games_Name = games_Name; } }
Et voici l'API Call:
public interface APIInterface { @GET() Call<List<ViewGame>> viewgamesjson(@Url String url); }
@tim long - il y a peut-être un problème avec "@Expose" dans votre classe de modèle. Retirez-le et vérifiez-le à nouveau.
aucun n'a fonctionné pour moi et je n'ai aucune idée de quoi que ce soit, je pense que je fais tout bien
@timlong je vous fournit tout. Son fonctionne bien. Il y a peut-être quelque chose de mineur qui vous manque. Vous pouvez supprimer votre modèle et le régénérer à nouveau. Cela fonctionne également.
ajouter une erreur de Logcat
n'obtient pas d'erreur dans la méthode de mise à niveau, l'erreur concerne l'adaptateur recyclerview car le nombre d'éléments est nul.
déboguer et vérifier
response.body ()
récupérer des données ou non.obtenir le corps de la réponse dans le débogage uniquement, essayer sans débogage donne null.
s'il vous plaît vérifier si vous avez ajouté @SerializedName sur les données membres de votre Game.class, cette annotation aide la mise à niveau pour analyser les données json dans votre classe java.