Java RSS阅读器为ListView创建自定义适配器
我尝试解析一些xml文件(RSS),并创建一个自定义列表视图来显示图像、标题和日期。唯一的问题是,当我调用rssdownloader类来下载和解析xml文件并从中创建适配器时,会出现null指针异常。我想这并不能证明解析xml文件是正确的。这是我的密码。任何帮助都将不胜感激 活动片段:Java RSS阅读器为ListView创建自定义适配器,java,android,xml,rss,Java,Android,Xml,Rss,我尝试解析一些xml文件(RSS),并创建一个自定义列表视图来显示图像、标题和日期。唯一的问题是,当我调用rssdownloader类来下载和解析xml文件并从中创建适配器时,会出现null指针异常。我想这并不能证明解析xml文件是正确的。这是我的密码。任何帮助都将不胜感激 活动片段: public class PublicaNewsActivity extends Fragment implements InterfaceFunc { public static ArrayList
public class PublicaNewsActivity extends Fragment implements InterfaceFunc {
public static ArrayList<PostData> listData;
Context mContext;
InterfaceFunc mInterface;
ListView mListView;
static PostItemAdapter itemAdapter;
public enum RSSXMLTag {
TITLE, DATE, LINK, CONTENT, GUID, IGNORETAG;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.publica_news, container, false);
mContext = getActivity();
mInterface = this;
ListView listView = (ListView) view.findViewById(R.id.postListView);
new RssDataController().execute("http://www.jurnaltv.md/rss.xml");
itemAdapter = new PostItemAdapter(mContext,
R.layout.publica_item, listData);
listView.setAdapter(itemAdapter);
return view;
}
public类PublicaNewsActivity扩展片段实现InterfaceFunc{
公共静态ArrayList listData;
语境;
接口Func mInterface;
列表视图;
静态positemAdapter项Adapter;
公共枚举RSSXMLTag{
标题、日期、链接、内容、GUID、IGNORETAG;
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.publica_新闻,容器,假);
mContext=getActivity();
mInterface=这个;
ListView=(ListView)view.findViewById(R.id.postListView);
新建RssDataController()。执行(“http://www.jurnaltv.md/rss.xml");
itemAdapter=新的PostItemAdapter(mContext,
R.layout.publica_项目,列表数据);
setAdapter(itemAdapter);
返回视图;
}
以下是PostItemAdapter:
public class PostItemAdapter extends ArrayAdapter<PostData> {
private Activity myContext;
private ArrayList<PostData> datas;
static class ViewHolder {
TextView postTitleView;
TextView postDateView;
ImageView postThumbView;
}
public PostItemAdapter(Context context, int textViewResourceId,
ArrayList<PostData> listData) {
super(context, textViewResourceId, listData);
// TODO Auto-generated constructor stub
myContext = (Activity) context;
datas = listData;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.publica_item, null);
viewHolder = new ViewHolder();
viewHolder.postThumbView = (ImageView) convertView
.findViewById(R.id.postThumb);
viewHolder.postTitleView = (TextView) convertView
.findViewById(R.id.postTitleLabel);
viewHolder.postDateView = (TextView) convertView
.findViewById(R.id.postDateLabel);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (datas.get(position).postThumbUrl == null) {
viewHolder.postThumbView
.setImageResource(R.drawable.ic_launcher);
}
viewHolder.postTitleView.setText(datas.get(position).postTitle);
viewHolder.postDateView.setText(datas.get(position).postDate);
return convertView;
}
}
公共类PostItemAdapter扩展了ArrayAdapter{
私人活动myContext;
私有数组列表数据;
静态类视窗夹{
文本视图postTitleView;
TextView postDateView;
ImageView postThumbView;
}
public PostItemAdapter(上下文,int textViewResourceId,
ArrayList(列表数据){
超级(上下文、textViewResourceId、listData);
//TODO自动生成的构造函数存根
myContext=(活动)上下文;
数据=列表数据;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
持票人持票人;
if(convertView==null){
LayoutInflater充气机=myContext.getLayoutInflater();
convertView=充气机。充气(R.layout.publica_项,空);
viewHolder=新的viewHolder();
viewHolder.postThumbView=(图像视图)convertView
.findViewById(R.id.postThumb);
viewHolder.postTitleView=(文本视图)convertView
.findViewById(R.id.postTitleLabel);
viewHolder.postDateView=(TextView)convertView
.findViewById(R.id.postDateLabel);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
if(data.get(position.postThumbUrl==null){
viewHolder.postThumbView
.setImageResource(R.drawable.ic_启动器);
}
viewHolder.postTitleView.setText(data.get(position.postTitle));
viewHolder.postDateView.setText(data.get(position.postDate));
返回视图;
}
}
和RSSDownloader:
class RssDataController extends
AsyncTask<String, Integer, ArrayList<PostData>> {
private RSSXMLTag currentTag;
@Override
protected ArrayList<PostData> doInBackground(String... params) {
// TODO Auto-generated method stub
String urlStr = params[0];
InputStream is = null;
ArrayList<PostData> postDataList = new ArrayList<PostData>();
try {
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setReadTimeout(10 * 1000);
connection.setConnectTimeout(10 * 1000);
connection.setRequestMethod("GET");
connection.setDoInput(true);
connection.connect();
int response = connection.getResponseCode();
Log.d("debug", "The response is: " + response);
is = connection.getInputStream();
// parse xml after getting the data
XmlPullParserFactory factory = XmlPullParserFactory
.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(is, null);
int eventType = xpp.getEventType();
PostData pdData = null;
SimpleDateFormat dateFormat = new SimpleDateFormat(
"EEE, DD MMM yyyy HH:mm:ss");
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
} else if (eventType == XmlPullParser.START_TAG) {
if (xpp.getName().equals("item")) {
pdData = new PostData();
currentTag = RSSXMLTag.IGNORETAG;
} else if (xpp.getName().equals("title")) {
currentTag = RSSXMLTag.TITLE;
} else if (xpp.getName().equals("link")) {
currentTag = RSSXMLTag.LINK;
} else if (xpp.getName().equals("pubDate")) {
currentTag = RSSXMLTag.DATE;
}
} else if (eventType == XmlPullParser.END_TAG) {
if (xpp.getName().equals("item")) {
// format the data here, otherwise format data in
// Adapter
Date postDate = dateFormat.parse(pdData.postDate);
pdData.postDate = dateFormat.format(postDate);
postDataList.add(pdData);
} else {
currentTag = RSSXMLTag.IGNORETAG;
}
} else if (eventType == XmlPullParser.TEXT) {
String content = xpp.getText();
content = content.trim();
Log.d("debug", content);
if (pdData != null) {
switch (currentTag) {
case TITLE:
if (content.length() != 0) {
if (pdData.postTitle != null) {
pdData.postTitle += content;
} else {
pdData.postTitle = content;
}
}
break;
case LINK:
if (content.length() != 0) {
if (pdData.postLink != null) {
pdData.postLink += content;
} else {
pdData.postLink = content;
}
}
break;
case DATE:
if (content.length() != 0) {
if (pdData.postDate != null) {
pdData.postDate += content;
} else {
pdData.postDate = content;
}
}
break;
default:
break;
}
}
}
eventType = xpp.next();
}
Log.v("tst", String.valueOf((postDataList.size())));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return postDataList;
}
@Override
public void onPostExecute(ArrayList<PostData> result) {
// TODO Auto-generated method stub
for (int i = 0; i < result.size(); i++) {
PublicaNewsActivity.listData.add(result.get(i));
}
PublicaNewsActivity.itemAdapter.notifyDataSetChanged();
}
}
类RssDataController扩展
异步任务{
私有RSSXMLTag currentTag;
@凌驾
受保护的ArrayList doInBackground(字符串…参数){
//TODO自动生成的方法存根
字符串urlStr=params[0];
InputStream=null;
ArrayList postDataList=新的ArrayList();
试一试{
URL=新URL(urlStr);
HttpURLConnection连接=(HttpURLConnection)url
.openConnection();
connection.setReadTimeout(10*1000);
连接。设置连接超时(10*1000);
connection.setRequestMethod(“GET”);
connection.setDoInput(true);
connection.connect();
int response=connection.getResponseCode();
Log.d(“调试”,“响应为:”+响应);
is=connection.getInputStream();
//获取数据后解析xml
XmlPullParserFactory工厂=XmlPullParserFactory
.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp=factory.newPullParser();
xpp.setInput(is,null);
int eventType=xpp.getEventType();
PostData pdData=null;
SimpleDataFormat dateFormat=新SimpleDataFormat(
“EEE,DD MMM yyyy HH:mm:ss”);
while(eventType!=XmlPullParser.END_文档){
if(eventType==XmlPullParser.START\u文档){
}else if(eventType==XmlPullParser.START_标记){
if(xpp.getName().equals(“项”)){
pdData=新的PostData();
currentTag=RSSXMLTag.IGNORETAG;
}else if(xpp.getName().equals(“title”)){
currentTag=RSSXMLTag.TITLE;
}else if(xpp.getName().equals(“链接”)){
currentTag=RSSXMLTag.LINK;
}else if(xpp.getName().equals(“pubDate”)){
currentTag=RSSXMLTag.DATE;
}
}else if(eventType==XmlPullParser.END_标记){
if(xpp.getName().equals(“项”)){
//在此处格式化数据,否则在中格式化数据
//适配器
Date postDate=dateFormat.parse(pdData.postDate);
pdData.postDate=dateFormat.format(postDate);
添加(pdData);
}否则{
currentTag=RSSXMLTag.IGNORETAG;
}
}else if(eventType==XmlPullParser.TEXT){
String content=xpp.getText();
content=content.trim();
Log.d(“调试”,内容);
如果(pdData!=null){
开关(当前标签){
案例名称:
如果(content.length()!=0){
if(pdData.postTitle!=null){
pdData.pos
ArrayList<PostData> listData is not initiated anywhere which gives null pointer exception.