Java 我的RSS解析器代码不断崩溃,我无法';我找不到问题所在
我试图在列表视图中获取并显示实时新闻,但它崩溃了 我看了一些教程和社区解决的问题,但我仍然无法在代码中找到问题。我在一个片段中工作,我使用的是MVC结构Java 我的RSS解析器代码不断崩溃,我无法';我找不到问题所在,java,android,Java,Android,我试图在列表视图中获取并显示实时新闻,但它崩溃了 我看了一些教程和社区解决的问题,但我仍然无法在代码中找到问题。我在一个片段中工作,我使用的是MVC结构 public class HomeFragment extends Fragment { private MutableLiveData<List<Article>> articleListLive = null; private String urlString = "https://www.andro
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);
}
}
公共类HomeFragment扩展了片段{
private MutableLiveData articleListLive=null;
专用字符串urlString=”https://www.androidauthority.com/feed";
私人回收视图mRecyclerView;
私人公寓;
private ArrayList listArticle=新建ArrayList();
公共HomeFragment(){
//必需的空公共构造函数
}
公共静态HomeFragment newInstance(){
返回(新的HomeFragment());
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment\u home,container,false);
ListView ListView=(ListView)rootView.findViewById(R.id.news\u列表);
setAdapter((ListAdapter)新的ArticleAdapter(listArticle,getContext());
返回rootView;
}
公共提要(){
Parser Parser=新解析器();
onFinish(新的OnTaskCompleted(){
@凌驾
已完成的公用void ontask(列表){
setArticleList(列表);
}
@凌驾
公共无效申报人(例外e){
setArticleList(新的ArrayList());
e、 printStackTrace();
snackbar.postValue(“发生错误,请重试”);
}
});
parser.execute(urlString);
}
私有MutableLiveData snackbar=新的MutableLiveData();
公共可变LiveData getArticleList(){
如果(articleListLive==null){
articleListLive=新的可变LiveData();
}
返回articleListLive;
}
私有void setArticleList(列表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);
}
}
}
公共类ArticleAdapter扩展了RecyclerView.Adapter{
私人物品清单;
私有上下文;
私有网络视图articleView;
公共ArticleAdapter(列表、上下文){
这个.文章=列表;
this.mContext=上下文;
}
公共列表getArticleList(){
归还物品;
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
视图v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.row,viewGroup,false);
返回新的视图持有者(v);
}
@凌驾
public void onBindViewHolder(@NonNull final ViewHolder ViewHolder,int position){
Article currentArticle=articles.get(位置);
字符串pubDateString;
试一试{
String sourceDateString=currentArticle.getPubDate();
SimpleDataFormat sourceSdf=新的SimpleDataFormat(“EEE,d MMM yyy HH:mm:ss Z”,Locale.ENGLISH);
Date-Date=sourceSdf.parse(sourceDateString);
SimpleDataFormat sdf=新的SimpleDataFormat(“dd-MMMM-yyyy”,Locale.getDefault());
pubDateString=sdf.format(日期);
}捕获(解析异常){
e、 printStackTrace();
pubDateString=currentArticle.getPubDate();
}
viewHolder.title.setText(currentArticle.getTitle());
毕加索
.load(currentArticle.getImage())
.placeholder(R.drawable.placeholder)
.into(viewHolder.image);
viewHolder.pubDate.setText(pubDateString);
StringBuilder类别=新建StringBuilder();
对于(int i=0;i