【问题标题】:Xml pull parsing with customised adapter使用自定义适配器进行 XML 拉取解析
【发布时间】:2013-04-18 17:16:06
【问题描述】:

嗨,我对 android 平台非常陌生 .. 迟到了,我尝试使用 xml pull parser 解析 rss 提要。当我使用 android 的标准 listview 布局时,我的代码工作得很好。但是当我尝试使用自定义列表视图和适配器实现相同的代码..没有显示数据..我用原始数据(不是从提要中获取的数据)测试了我的自定义适配器,它运行良好..但是当我尝试使用从提要中获取的信息,列表视图不显示任何数据..已经尝试了很长一段时间,但无法完成..任何人都可以帮我确定我所犯的错误...请注意,我的应用程序可以与非互联网数据完美运行,但不能从提要中获取。我正在尝试从提要中提取标题标签。任何帮助将不胜感激...代码如下

MainActivity.java

public class MainActivity extends Activity {
    ArrayList<FeedData> headlines;
    List <String>title;
    FeedData data = new FeedData();
    List links;
    String msg =null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        title = new ArrayList<String>();
        links = new ArrayList();
        headlines = new ArrayList<FeedData>();

        DownloadTask runner =new DownloadTask();
        runner.execute();

        for(int i=0;i<title.size();i++){
            msg=title.get(i).toString();
            data.setTitle(msg);
            headlines.add(data);
        }


         FeedAdapter adapter= new    FeedAdapter(MainActivity.this,R.layout.imagefeed,headlines);
        ListView list = (ListView)findViewById(R.id.lvMyFeed);
        list.setAdapter(adapter);  

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    public class DownloadTask extends AsyncTask<String,Integer,String> {

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }


        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
        try{    URL url = new URL("http://www.pcworld.com/index.rss  ");
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(false);
        XmlPullParser xpp = factory.newPullParser();

            // We will get the XML from an input stream
        xpp.setInput(getInputStream(url), "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;
                } else if (xpp.getName().equalsIgnoreCase("title")) {
                    if (insideItem)
                        title.add(xpp.nextText()); //extract the headline
                } else if (xpp.getName().equalsIgnoreCase("link")) {
                    if (insideItem)
                        links.add(xpp.nextText()); //extract the link of article
                }
            }else if(eventType==XmlPullParser.END_TAG &&   xpp.getName().equalsIgnoreCase("item")){
                insideItem=false;
            }

            eventType = xpp.next(); //move to next element
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

        return null;
    }
        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);

        }


        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
        }
        public InputStream getInputStream(URL url) {
               try {
                   return url.openConnection().getInputStream();
               } catch (IOException e) {
                   return null;
                 }
            }

    }// end of DownloadTask class

      }`

FeedData.java

      public class FeedData {
    String headlines;

    public FeedData()
    {

    }
    public FeedData(String title) {
        this.headlines=title;
    }

    public void setTitle(String title){
        this.headlines=title;
    }
    public String getTitle(){

        return headlines;
    }

       }`

      `FeedData.java
        public class FeedData {
    String headlines;

    public FeedData()
    {

    }
    public FeedData(String title) {
        this.headlines=title;
    }

    public void setTitle(String title){
        this.headlines=title;
    }
    public String getTitle(){

        return headlines;
    }

        }

activity_main.xml

    <ListView
    android:id="@+id/lvMyFeed"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
    </ListView>

    </LinearLayout>

imagefeed.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
    android:id="@+id/ivImg"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="28dp"
    android:layout_marginTop="38dp"
    android:src="@drawable/ic_launcher" />

    <TextView
    android:id="@+id/tvFeed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/ivImg"
    android:layout_marginLeft="78dp"
    android:layout_marginTop="14dp"
    android:layout_toRightOf="@+id/ivImg"
    android:text="Headlines" />

    </RelativeLayout>

【问题讨论】:

  • 请贴出FeedAdapter的定义。
  • @Joe Malin:FeedAdapter 只是一个 Java 类,我在其中定义了我的自定义适配器..它只是一个扩展 Base 适配器的类..dats it..

标签: android parsing rss listadapter


【解决方案1】:

显示或设置您的adapterListView 完成后DownloadTask 表示调用

  FeedAdapter adapter= new    FeedAdapter(MainActivity.this,R.layout.imagefeed,headlines);
  ListView list = (ListView)findViewById(R.id.lvMyFeed);
  list.setAdapter(adapter);  

onPostExecuteAsynchTask 的行为是不同的线程,因此,您的 headlines title ArrayList 没有数据说明您的数据未显示在 ListView 上的原因。所以在完成 DownloadTask 后设置你的adapter。希望这会帮助你。

【讨论】:

  • 谢谢..确实是主要问题...谢谢您的回答..非常感谢..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2019-01-12
  • 2015-05-29
相关资源
最近更新 更多