java - 我的 RSS 解析器代码不断崩溃,我找不到问题所在
问题描述
我正在尝试在列表视图中获取和显示实时新闻,但它崩溃了。
我查看了社区解决的一些教程和问题,但我仍然无法在我的代码中找到问题所在。我在一个片段内工作,我正在使用 MVC 结构。
public class HomeFragment extends Fragment {
private MutableLiveData<List<Article>> articleListLive = null;
private String urlString = "https://www.androidauthority.com/feed";
private RecyclerView mRecyclerView;
private ArticleAdapter mAdapter;
private ArrayList<Article> listArticle = new ArrayList<Article>();
public HomeFragment() {
// Required empty public constructor
}
public static HomeFragment newInstance () {
return (new HomeFragment());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
ListView listView = (ListView)rootView.findViewById(R.id.news_list);
listView.setAdapter((ListAdapter) new ArticleAdapter(listArticle,getContext()));
return rootView;
}
public void fetchFeed() {
Parser parser = new Parser();
parser.onFinish(new OnTaskCompleted() {
@Override
public void onTaskCompleted(List<Article> list) {
setArticleList(list);
}
@Override
public void onError(Exception e) {
setArticleList(new ArrayList<Article>());
e.printStackTrace();
snackbar.postValue("An error has occurred. Please try again");
}
});
parser.execute(urlString);
}
private MutableLiveData<String> snackbar = new MutableLiveData<>();
public MutableLiveData<List<Article>> getArticleList() {
if (articleListLive == null) {
articleListLive = new MutableLiveData<>();
}
return articleListLive;
}
private void setArticleList(List<Article> articleList) {
this.articleListLive.postValue(articleList);
}
}
我期待一个新闻列表,但它崩溃了。这是我的适配器类:
public class ArticleAdapter extends RecyclerView.Adapter<ArticleAdapter.ViewHolder> {
private List<Article> articles;
private Context mContext;
private WebView articleView;
public ArticleAdapter(List<Article> list, Context context) {
this.articles = list;
this.mContext = context;
}
public List<Article> getArticleList() {
return articles;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int position) {
Article currentArticle = articles.get(position);
String pubDateString;
try {
String sourceDateString = currentArticle.getPubDate();
SimpleDateFormat sourceSdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
Date date = sourceSdf.parse(sourceDateString);
SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy", Locale.getDefault());
pubDateString = sdf.format(date);
} catch (ParseException e) {
e.printStackTrace();
pubDateString = currentArticle.getPubDate();
}
viewHolder.title.setText(currentArticle.getTitle());
Picasso.get()
.load(currentArticle.getImage())
.placeholder(R.drawable.placeholder)
.into(viewHolder.image);
viewHolder.pubDate.setText(pubDateString);
StringBuilder categories = new StringBuilder();
for (int i = 0; i < currentArticle.getCategories().size(); i++) {
if (i == currentArticle.getCategories().size() - 1) {
categories.append(currentArticle.getCategories().get(i));
} else {
categories.append(currentArticle.getCategories().get(i)).append(", ");
}
}
viewHolder.category.setText(categories.toString());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@SuppressLint("SetJavaScriptEnabled")
@Override
public void onClick(View view) {
//show article content inside a dialog
articleView = new WebView(mContext);
articleView.getSettings().setLoadWithOverviewMode(true);
String title = articles.get(viewHolder.getAdapterPosition()).getTitle();
String content = articles.get(viewHolder.getAdapterPosition()).getContent();
articleView.getSettings().setJavaScriptEnabled(true);
articleView.setHorizontalScrollBarEnabled(false);
articleView.setWebChromeClient(new WebChromeClient());
articleView.loadDataWithBaseURL(null, "<style>img{display: inline; height: auto; max-width: 100%;} " +
"</style>\n" + "<style>iframe{ height: auto; width: auto;}" + "</style>\n" + content, null, "utf-8", null);
AlertDialog alertDialog = new AlertDialog.Builder(mContext).create();
alertDialog.setTitle(title);
alertDialog.setView(articleView);
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
((TextView) alertDialog.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
}
});
}
@Override
public int getItemCount() {
return articles == null ? 0 : articles.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView pubDate;
ImageView image;
TextView category;
public ViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
pubDate = itemView.findViewById(R.id.pubDate);
image = itemView.findViewById(R.id.image);
category = itemView.findViewById(R.id.categories);
}
}
}
解决方案
啊。给你。您正在尝试将 Recycler Adapter 转换为列表适配器。因此类转换异常。
您可以将列表视图替换为回收站视图。
推荐阅读
- c# - 检查列表中是否存在项目c#
- html - CSS/HTML 下拉菜单出现在左侧,而不是 Chrome、Edge 上的父级下方,但不是 Safari
- php - TCP 协议是否也像 HTTP 协议一样处理 cookie?
- c# - 如何让敌方角色停止盘旋玩家?
- java - 当我更改条目的键时,Java PriorityQueue 是否会重新排列?
- python - 使用python将Twitter的json按字段插入MongoDB
- spring-mvc - 使用 Thymeleaf 转义 XML
- python - Tensorflow:NotFoundError:没有这样的文件或目录
- arrays - 访问数组 Laravel
- elixir - Elixir:使用 Absinthe 查询图形数据库 Dgraph。GraphQL 到 GraphQL+ 的映射