Java 使用sectionPager在片段中加载RSS
我正在尝试为一个RSS阅读器编写标签页的分区寻呼机,但在解析器中加载RSS提要时遇到了问题。我将在这里发布这两个类Java 使用sectionPager在片段中加载RSS,java,android,xml,parsing,rss,Java,Android,Xml,Parsing,Rss,我正在尝试为一个RSS阅读器编写标签页的分区寻呼机,但在解析器中加载RSS提要时遇到了问题。我将在这里发布这两个类 public class MainActivity extends AppCompatActivity { /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a
public class MainActivity extends AppCompatActivity {
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link FragmentPagerAdapter} derivative, which will keep every
* loaded fragment in memory. If this becomes too memory intensive, it
* may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
private SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager} that will host the section contents.
*/
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
protected static final String ARG_SECTION_NUMBER = "section_number";
private List<Entry> theFeed;
public String adUrl = "http://www.blindbargains.com/mobileads.php?android";
public String NewsUrl = "http://www.blindbargains.com/rss/newsnoads.xml";
public String BargainsUrl = "";
public String ClassifiedsUrl = "";
public String AudioUrl = "";
public ListView feedList;
public WebView adView;
public PlaceholderFragment() {
}
/**
* Returns a new instance of this fragment for the given section
* number.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
adView = (WebView) rootView.findViewById(R.id.adView);
feedList = (ListView) getActivity().findViewById(R.id.feedList);
adView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
adView.getSettings().setJavaScriptEnabled(true);
Log.i("XML", "The section number is " + (getArguments().getInt(ARG_SECTION_NUMBER)));
//textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
if (getArguments().getInt(ARG_SECTION_NUMBER) == 1) {
adView.loadUrl(adUrl);
Log.i("XML", NewsUrl);
new DownloadXmlTask().execute("http://www.blindbargains.com/rss/newsnoads.xml");
//feedList = (ListView) findViewById(R.id.feedList);
//ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, theList);
//feedList.setAdapter(arrayAdapter);
//setContentView(theListView);]
} else if (getArguments().getInt(ARG_SECTION_NUMBER) == 2) {
adView.loadUrl(adUrl);
new DownloadXmlTask().execute("http://www.blindbargains.com/rss/classifiedsnoads.xml");
//feedList = (ListView) findViewById(R.id.feedList);
//ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, theList);
//feedList.setAdapter(arrayAdapter);
//setContentView(theListView);
} else if (getArguments().getInt(ARG_SECTION_NUMBER) == 3) {
adView.loadUrl(adUrl);
new DownloadXmlTask().execute(ClassifiedsUrl);
//feedList = (ListView) findViewById(R.id.feedList);
//ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, theList);
//feedList.setAdapter(arrayAdapter);
//setContentView(theListView);
} else if (getArguments().getInt(ARG_SECTION_NUMBER) == 4) {
adView.loadUrl(adUrl);
new DownloadXmlTask().execute(AudioUrl);
//feedList = (ListView) findViewById(R.id.feedList);
//ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, theList);
//feedList.setAdapter(arrayAdapter);
//setContentView(theListView);
}
return rootView;
}
@Override
public void onStart() {
super.onStart();
}
// Implementation of AsyncTask used to download XML feed from stackoverflow.com.
private class DownloadXmlTask extends AsyncTask<String, Void, List<Entry>> {
@Override
protected List<Entry> doInBackground(String... urls) {
try {
Log.i("XML", "The URL to load is " + urls[0]);
return loadXmlFromNetwork(urls[0]);
} catch (IOException e) {
Log.i("Error","Connection Error!");
Log.i("XML", "The URL that should have loaded is " + urls[0]);
return null;
} catch (XmlPullParserException e) {
Log.i("Error", "XML Error");
return null;
}
}
@Override
protected void onPostExecute(List<Entry> result) {
// Displays the HTML string in the UI via a WebView
//Log.i("XML", result.toString());
if (result != null && result.size() > 0) {
for (Entry entry : result) {
String title = entry.title;
String link = entry.link;
String date = entry.theDate;
Log.i("XML", "The title is " + entry.title);
}
}
}
}
// Uploads XML from stackoverflow.com, parses it, and combines it with
// HTML markup. Returns HTML string.
private List<Entry> loadXmlFromNetwork(String urlString) throws XmlPullParserException, IOException {
//Log.i("XML", "Load XML function called");
InputStream stream = null;
XMLParser xmlParser = new XMLParser();
List<Entry> entries = null;
String title = null;
String url = null;
String summary = null;
//Calendar rightNow = Calendar.getInstance();
//DateFormat formatter = new SimpleDateFormat("MMM dd h:mmaa");
Log.i("XML", "The URL to load in the stream is "+ NewsUrl);
stream = downloadUrl(urlString);
entries = xmlParser.parse(stream);
if (entries.size() > 0 ) {
Log.i("XML", "There are entries loaded in the parser.");
}
// Makes sure that the InputStream is closed after the app is
// finished using it.
if (stream != null) {
stream.close();
}
return entries;
}
// Given a string representation of a URL, sets up a connection and gets
// an input stream.
private InputStream downloadUrl(String urlString) throws IOException {
URL url = new URL(urlString);
Log.i("XML", "The input stream url is " + urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
InputStream stream = conn.getInputStream();
Log.i("XML", "The input stream contains: " + stream);
return stream;
}
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public static class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, position);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
// Show 4 total pages.
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Latest";
case 1:
return "Bargains";
case 2:
return "Classifieds";
case 3:
return "Audio";
}
return null;
}
}
}
public类MainActivity扩展了AppCompatActivity{
/**
*将提供的{@link android.support.v4.view.PagerAdapter}
*每个部分的片段。我们使用
*{@link FragmentPagerAdapter}派生,它将保留
*已在内存中加载片段。如果这变得过于内存密集,则
*最好是换成一个
*{@link android.support.v4.app.FragmentStatePagerAdapter}。
*/
私人部门SPAGERAAdapter MSECTIONSPAGERAAdapter;
/**
*将承载节内容的{@link ViewPager}。
*/
私有视图寻呼机mViewPager;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
//创建适配器,该适配器将为这三个函数中的每一个返回一个片段
//活动的主要部分。
mSectionsPagerAdapter=newsectionspageradapter(getSupportFragmentManager());
//使用分区适配器设置ViewPager。
mViewPager=(ViewPager)findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout TabLayout=(TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mviewpage);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
/**
*包含简单视图的占位符片段。
*/
公共静态类占位符片段扩展了片段{
/**
*表示此文件节号的片段参数
*碎片。
*/
受保护的静态最终字符串ARG\u SECTION\u NUMBER=“SECTION\u NUMBER”;
私人名单;
公共字符串adUrl=”http://www.blindbargains.com/mobileads.php?android";
公共字符串NewsUrl=”http://www.blindbargains.com/rss/newsnoads.xml";
公共字符串BargainsUrl=“”;
公共字符串ClassifiedsUrl=“”;
公共字符串AudioUrl=“”;
公共列表视图提要列表;
公共网络视图咨询;
公共占位符片段(){
}
/**
*返回给定节的此片段的新实例
*号码。
*/
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment_main,容器,错误);
adView=(WebView)rootView.findviewbyd(R.id.adView);
feedList=(ListView)getActivity().findViewById(R.id.feedList);
adView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
adView.getSettings().setJavaScriptEnabled(true);
Log.i(“XML”,“节号为”+(getArguments().getInt(ARG_section_number)));
//setText(getString(R.string.section_格式,getArguments().getInt(ARG_section_编号)));
if(getArguments().getInt(ARG\u节号)==1){
adView.loadUrl(adUrl);
Log.i(“XML”,NewsUrl);
新建DownloadXmlTask()。执行(“http://www.blindbargains.com/rss/newsnoads.xml");
//feedList=(ListView)findViewById(R.id.feedList);
//ArrayAdapter ArrayAdapter=新的ArrayAdapter(this.getActivity(),android.R.layout.simple\u list\u item\u 1,列表);
//feedList.setAdapter(arrayAdapter);
//setContentView(列表视图);]
}else if(getArguments().getInt(ARG\u节号)==2){
adView.loadUrl(adUrl);
新建DownloadXmlTask()。执行(“http://www.blindbargains.com/rss/classifiedsnoads.xml");
//feedList=(ListView)findViewById(R.id.feedList);
//ArrayAdapter ArrayAdapter=新的ArrayAdapter(this.getActivity(),android.R.layout.simple\u list\u item\u 1,列表);
//feedList.setAdapter(arrayAdapter);
//设置内容视图(ListView);
}else if(getArguments().getInt(ARG\u节号)==3){
adView.loadUrl(adUrl);
新建DownloadXmlTask().execute(ClassifiedsUrl);
//feedList=(ListView)findViewById(R.id.feedList);
//ArrayAdapter ArrayAdapter=新的ArrayAdapter(this.getActivity(),android.R.layout.simple\u list\u item\u 1,列表);
//feedList.setAdapter(arrayAdapter);
//设置内容视图(ListView);
}else if(getArguments().getInt(ARG\u节号)==4){
adView.loadUrl(adUrl);
新建DownloadXmlTask().execute(AudioUrl);
//feedList=(ListView)findViewById(R.id.feedList);
//ArrayAdapter ArrayAdapter=新的ArrayAdapter(this.getActivity(),android.R.layout.simple\u list\u item\u 1,列表);
//feedList.setAdapter(arrayAdapter);
//设置内容视图(ListView);
}
返回rootView;
}
@凌驾
public void onStart(){
super.onStart();
}
//用于从stackoverflow.com下载XML提要的AsyncTask的实现。
私有类DownloadXmlTask扩展了AsyncTask{
@凌驾
受保护列表doInBackground(字符串…URL){
试一试{
Log.i(“XML”,“要加载的URL是”+URL[0]);
返回loadXmlFromNetwork(URL[0]);
}猫
* This class parses XML feeds from stackoverflow.com.
* Given an InputStream representation of a feed, it returns a List of entries,
* where each list element represents a single entry (post) in the XML feed.
*/
public class XMLParser {
private static final String ns = null;
// We don't use namespaces
public List<Entry> parse(InputStream in) throws XmlPullParserException, IOException {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in, null);
parser.nextTag();
return readFeed(parser);
} finally {
in.close();
}
}
private List<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
List<Entry> entries = new ArrayList<Entry>();
parser.require(XmlPullParser.START_TAG, ns, "rss");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
// Starts by looking for the entry tag
if (name.equals("item")) {
entries.add(readEntry(parser));
} else {
skip(parser);
}
}
return entries;
}
// This class represents a single entry (post) in the XML feed.
// It includes the data members "title," "link," and "summary."
public static class Entry {
public final String title;
public final String link;
public final String summary;
public final String theDate;
private Entry(String title, String summary, String link, String theDate) {
this.title = title;
this.summary = summary;
this.link = link;
this.theDate = theDate;
}
}
// Parses the contents of an entry. If it encounters a title, summary, or link tag, hands them
// off
// to their respective "read" methods for processing. Otherwise, skips the tag.
private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, ns, "item");
String title = null;
String summary = null;
String link = null;
String theDate = null;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("title")) {
title = readTitle(parser);
} else if (name.equals("summary")) {
summary = readSummary(parser);
} else if (name.equals("link")) {
link = readLink(parser);
} else if (name.equals("pubDate")) {
theDate = readDate(parser);
} else {
skip(parser);
}
}
return new Entry(title, summary, link, theDate);
}
// Processes title tags in the feed.
private String readTitle(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "title");
String title = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "title");
return title;
}
// Processes link tags in the feed.
private String readLink(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "link");
String link = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "link");
return link;
}
// Processes summary tags in the feed.
private String readSummary(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "summary");
String summary = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "summary");
return summary;
}
private String readDate(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "pubDate");
String theDate = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "pubDate");
return theDate;
}
// For the tags title and summary, extracts their text values.
private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
String result = "";
if (parser.next() == XmlPullParser.TEXT) {
result = parser.getText();
parser.nextTag();
}
Log.i("XML", result);
return result;
}
// Skips tags the parser isn't interested in. Uses depth to handle nested tags. i.e.,
// if the next tag after a START_TAG isn't a matching END_TAG, it keeps going until it
// finds the matching END_TAG (as indicated by the value of "depth" being 0).
private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
if (parser.getEventType() != XmlPullParser.START_TAG) {
throw new IllegalStateException();
}
int depth = 1;
while (depth != 0) {
switch (parser.next()) {
case XmlPullParser.END_TAG:
depth--;
break;
case XmlPullParser.START_TAG:
depth++;
break;
}
}
}
}