I'm working on news android project using RSS feed, my app now can get title, description, time of news perfectly but I can't get the image it shows me the following error:
java.lang.NullPointerException: uriString
at android.net.Uri$StringUri.<init>(Uri.java:464)
at android.net.Uri$StringUri.<init>(Uri.java:454)
at android.net.Uri.parse(Uri.java:426)
at com.example.drmzr.myapplication.MyAdapter.onBindViewHolder(MyAdapter.java:36)
at com.example.drmzr.myapplication.MyAdapter.onBindViewHolder(MyAdapter.java:12)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5453) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5486) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4723)
This is my code (my Article.java) :
public class Article {
String title,description,date,link,image;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}
This is (my Adapter.java) :
public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
Context c;
ArrayList<Article> articles;
public MyAdapter(Context c, ArrayList<Article> articles) {
this.c = c;
this.articles = articles;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v= LayoutInflater.from(c).inflate(R.layout.model,parent,false);
return new MyHolder(v);
}
@Override
public void onBindViewHolder(MyHolder holder, int position) {
Article article=articles.get(position);
holder.titleTxt.setText(article.getTitle());
holder.descTxt.setText(article.getDescription());
holder.dateTxt.setText(article.getDate());
holder.gimage.setImageURI(Uri.parse(article.getImage())) ;
}
@Override
public int getItemCount() {
return articles.size();
}
}
This the line that contains the error above (holder.gimage.setImageURI(Uri.parse(article.getImage())) ;)
This is (my RSSParser.java) :
public class RSSParser extends AsyncTask<Void,Void,Boolean> {
Context c;
InputStream is;
RecyclerView rv;
ProgressDialog pd;
ArrayList<Article> articles=new ArrayList<>();
public RSSParser(Context c, InputStream is, RecyclerView rv) {
this.c = c;
this.is = is;
this.rv = rv;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pd=new ProgressDialog(c);
pd.setTitle("Parse data");
pd.setMessage("Parsing data...Please wait");
pd.show();
}
@Override
protected Boolean doInBackground(Void... params) {
return this.parseRSS();
}
@Override
protected void onPostExecute(Boolean isParsed) {
super.onPostExecute(isParsed);
pd.dismiss();
if(isParsed)
{
//Bind
rv.setAdapter(new MyAdapter(c,articles));
}else {
Toast.makeText(c,"Unable To Parse", Toast.LENGTH_SHORT).show();
}
}
private Boolean parseRSS()
{
try
{
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser parser=factory.newPullParser();
parser.setInput(is, null);
int event=parser.getEventType();
String value=null;
articles.clear();
Article article=new Article();
do {
String name=parser.getName();
switch (event)
{
case XmlPullParser.START_TAG:
if(name.equals("item"))
{
article=new Article();
}
break;
case XmlPullParser.TEXT:
value=parser.getText();
break;
case XmlPullParser.END_TAG:
if(name.equals("title"))
{
article.setTitle(value);
}
else if(name.equals("description"))
{
article.setDescription(value);
}else if(name.equals("pubDate"))
{
article.setDate(value);
}else if(name.equals("date"))
{
article.setDate(value);
}else if(name.equals("image"))
{
article.setImage(value) ;
}
if(name.equals("item"))
{
articles.add(article);
}
break;
}
event=parser.next();
}while (event != XmlPullParser.END_DOCUMENT);
return true;
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
public String getImage() {
if (description.startsWith("<a ")) {
String cleanUrl = description.substring(description.indexOf("src=") + 5, description.indexOf("/>") - 2);
return cleanUrl;
} else {
return image;
}
}
Reference answer : https://stackoverflow.com/a/38465145