#java #android #android-recyclerview #retrofit2
#java #Android #android-recyclerview #доработка2
Вопрос:
Я разрабатываю приложение Sport news для Android, но когда я запускаю приложение, оно показывает скриншот эмулятора с белым экраном.
ниже мой класс адаптера
открытый класс ArticleAdapter расширяет RecyclerView.Адаптер {
private List<Article> articles;
public ArticleAdapter(List<Article> articles, SportNews sportNews) {
this.articles = articles;
}
@NonNull
@Override
public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View itemView = (View) LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.article_list, null);
return new CustomViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull CustomViewHolder customViewHolder, int position) {
Article article = articles.get(position);
customViewHolder.articleAuthor.setText(article.getAuthor());
customViewHolder.articleTitle.setText(article.getTitle());
Picasso.get().load(article.getUrlToImage()).into(customViewHolder.articleImage);
}
@Override
public int getItemCount() {
if(articles == null) return 0;
return articles.size();
}
public class CustomViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.articleAuthor)
TextView articleAuthor;
@BindView(R.id.articleTitle)
TextView articleTitle;
@BindView(R.id.articleImage)
ImageView articleImage;
public CustomViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
}
}
ниже модифицированный класс интерфейса общедоступный интерфейс SportInterface {
@GET("/v2/top-headlines?sources=bbc-sportamp;apiKey=d03441ae1be44f9cad8c38a2fa6db215")
Call<SportNews> getArticles();
}
ниже модифицированный клиент
открытый класс SportClient {
private static final String ROOT_URL = "https://newsapi.org";
/**
* Get Retrofit Instance
*/
private static Retrofit getRetrofitInstance() {
return new Retrofit.Builder()
.baseUrl(ROOT_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
/**
* Get API Service
*
* @return API Service
*/
public static SportInterface getApiService() {
return getRetrofitInstance().create(SportInterface.class);
}
}
ниже MainActivity.java
открытый класс MainActivity расширяет AppCompatActivity {
private SportNews sportNews;
private List<Article> articleList;
private ArticleAdapter articleAdapter;
@BindView(R.id.recyclerView)
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
SportInterface sportInterface = SportClient.getApiService();
Call<SportNews> call = sportInterface.getArticles();
call.enqueue(new Callback<SportNews>() {
@Override
public void onResponse(Call<SportNews> call, Response<SportNews> response) {
sportNews = response.body();
articleAdapter = new ArticleAdapter( articleList, sportNews);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(articleAdapter);
}
@Override
public void onFailure(Call<SportNews> call, Throwable t) {
}
});
}
}
ниже модель SportNews class
общедоступный класс SportNews {
@SerializedName("status")
@Expose
private String status;
@SerializedName("totalResults")
@Expose
private Integer totalResults;
@SerializedName("articles")
@Expose
private List<Article> articles = null;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Integer getTotalResults() {
return totalResults;
}
public void setTotalResults(Integer totalResults) {
this.totalResults = totalResults;
}
public List<Article> getArticles() {
return articles;
}
public void setArticles(List<Article> articles) {
this.articles = articles;
}
}
ниже ответ json
{
"status": "ok",
"totalResults": 10,
"articles": [
{
"source": {
"id": "bbc-sport",
"name": "BBC Sport"
},
"author": "BBC Sport",
"title": "Gordon Taylor: PFA chief executive set to step down after 38 years",
"description": "Gordon Taylor to announce he will step down as chief executive of the Professional Footballers' Association (PFA) at the end of the season after 38 years.",
"url": "http://www.bbc.co.uk/sport/football/47691299",
"urlToImage": "https://ichef.bbci.co.uk/onesport/cps/624/cpsprodpb/13590/production/_97584297_breaking_news.png",
"publishedAt": "2019-03-27T13:04:18Z",
"content": "Gordon Taylor is set to announce he is standing down as chief executive of the Professional Footballers' Association after 38 years in the role.rnIt follows a mutiny from PFA chairman Ben Purkiss and former players over governance issues and controversy over … [ 675 chars]"
},
]
}
Комментарии:
1. Войдите в систему
onFailure
и проверьте, получаете ли вы что-нибудь2. @HB у вас есть другие предложения
3. Что вы имеете в виду под другими предложениями? Вы проверили
onFailure
?
Ответ №1:
Привет, просто скопируйте и вставьте приведенный ниже код, потому что я отредактировал ваш класс MainActivity, куда вы забыли добавить список из объекта sportNews, к которому вы можете получить доступ в ответ на вызов api.
public class MainActivity extends AppCompatActivity {
private SportNews sportNews;
private List<Article> articleList = new ArrayList<Article>();
private ArticleAdapter articleAdapter;
@BindView(R.id.recyclerView)
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
SportInterface sportInterface = SportClient.getApiService();
Call<SportNews> call = sportInterface.getArticles();
call.enqueue(new Callback<SportNews>() {
@Override
public void onResponse(Call<SportNews> call, Response<SportNews> response) {
sportNews = response.body();
if(sportNews != null amp;amp; sportNews.getArticles() != null){
articleList.addAll(sportNews.getArticles());
}
articleAdapter = new ArticleAdapter( articleList, sportNews);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(articleAdapter);
}
@Override
public void onFailure(Call<SportNews> call, Throwable t) {
}
});
}
}
Ответ №2:
ваша проблема в этой строке
articleAdapter = new ArticleAdapter( articleList, sportNews);
должно быть заменено этим
articleList=sportNews.getArticles();
articleAdapter = new ArticleAdapter( articleList, sportNews);
Ответ №3:
попробуйте это. я думаю, что ваш адаптер неправильный.
public class ArticleAdapter extends RecyclerView.Adapter<ArticleAdapter.CustomViewHolder> {