我有以下的自定義類從幾個RSS像紐約時報,BBC等:飼料來獲取新聞XmlPullParser與自定義類不顯示所有的RSS訂閱
class News{
String title;
String link;
String imageURL;
}
這是我的代碼用它來解析XML數據:
void getRSSList() {
newsArray = new ArrayList<News>();
// Load each RSS feed URL in a for loop
for (int i = 0; i < catURLsList.size(); i++) {
String feedURL = catURLsList.get(i);
try {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
URL aUrl = new URL(feedURL);
InputStream is = getInputStream(aUrl);
parseRssFeeds(is);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
void parseRssFeeds(InputStream is) {
News n = new News();
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(is, "UTF_8");
boolean insideItem = false;
// Returns the type of current event: START_TAG, END_TAG, etc..
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (xpp.getName().equalsIgnoreCase("item")) {
insideItem = true;
// Get LINK
} else if (xpp.getName().equalsIgnoreCase("link")) {
if (insideItem) {
n.link = xpp.nextText();
Log.i("log-", "LINK: " + n.link);
}
// Get TITLE
} else if (xpp.getName().equalsIgnoreCase("title")) {
if (insideItem) {
n.title = xpp.nextText();
Log.i("log-", "TITLE: " + n.title);
}
// Get MEDIA URL
} else if (xpp.getName().equalsIgnoreCase("media:content")) {
if (insideItem)
n.imageURL = xpp.getAttributeValue(null, "url");
Log.i("log-", "MEDIA URL: " + n.imageURL);
}
} else if (eventType == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")) {
insideItem = false;
}
// Add news objects to the newsArray
newsArray.add(n);
eventType = xpp.next(); // move to next element
} // end WHILE loop
} catch(Exception e) { e.printStackTrace(); }
setNewsGridView();
}
setNewsGridView()調用與GridAdapter內,顯示標題和RSSfeeds的圖像的方法,問題是,我得到了我的logcat的所有標題,鏈接和媒體的URL ,但我只得到一個新聞提要重複編輯在我的GridView的每個單元格中,可能與newsArray的大小相同。
這是我GridAdapter:
// MARK: - SET NEWS GRID VIEW ---------------------------------------------
void setNewsGridView() {
class GridAdapter extends BaseAdapter {
private Context context;
public GridAdapter(Context context, List<News> objects) {
super();
this.context = context;
}
// CONFIGURE CELL
@Override
public View getView(int position, View cell, ViewGroup parent) {
if (cell == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
cell = inflater.inflate(R.layout.cell_news, null);
}
// Get News object
News n = newsArray.get(position);
// Get Title
TextView titleTxt = (TextView) cell.findViewById(R.id.cnTitleTxt);
titleTxt.setText(n.title);
// Get Image
ImageView newsImg = (ImageView)cell.findViewById(R.id.cnImage);
if (n.imageURL != null) {
Picasso.with(context).load(n.imageURL).into(newsImg);
} else { newsImg.setImageResource(R.drawable.logo); }
return cell;
}
@Override public int getCount() { return newsArray.size(); }
@Override public Object getItem(int position) { return newsArray.get(position); }
@Override public long getItemId(int position) { return position; }
}
// Init GridView and set its adapter
GridView aGrid = (GridView) findViewById(R.id.hNewsGridView);
aGrid.setAdapter(new GridAdapter(Home.this, newsArray));
// Set number of Columns accordingly to the device used
float scalefactor = getResources().getDisplayMetrics().density * 150; // 150 is the cell's width
int number = getWindowManager().getDefaultDisplay().getWidth();
int columns = (int) ((float) number/(float) scalefactor);
aGrid.setNumColumns(columns);
}
我logcat的,當我運行的應用程序:
I/log-: TITLE: Senate Votes Down Broad Obamacare Repeal
I/log-: LINK: https://www.nytimes.com/2017/07/25/us/politics/senate-health-care.html?partner=rss&emc=rss
I/log-: MEDIA URL: https://static01.nyt.com/images/2017/07/26/us/26dc-health-sub1/26dc-health-sub1-moth.jpg
I/log-: TITLE: John McCain to Senate: ‘We’re Getting Nothing Done’
I/log-: LINK: https://www.nytimes.com/video/us/politics/100000005305566/john-mccain-health-bill-vote.html?partner=rss&emc=rss
I/log-: TITLE: McCain Returns to Cast Vote to Help the President Who Derided Him
I/log-: LINK: https://www.nytimes.com/2017/07/25/us/politics/mccain-health-care-brain-cancer
etc...
...
這是輸出我得到的設備上:
我在做什麼錯?
非常感謝!
它不工作:(也, 「如果(N!= NULL)」 始終是真實的,所以它不是如果我使用「News n = new News()」,它會在我的GridView中給我空單元格,而如果我使用「News n = null」,它根本不會給我任何單元格。 – cubycode
好的,我會稍後再試,我注意到它甚至不打印日誌,並且即使我在我的應用程序中根本不使用SQL,它仍然會打印SQL錯誤... – cubycode
n如果eventType是類型爲「item」的START_TAG或非START_TAG,則它將爲空,因爲它始於空值且始終不會填充。當你說它不起作用時,你會得到什麼?可能有很多部分填充的面板,一些帶有鏈接,一些標題和一些URL? – hugh