1

学校新聞のアプリを作成していますが、記事全体を表示しようとすると問題が発生します。現在、RSS フィードから取得した記事のリストが表示されており、クリックすると記事の内容が表示されます。ただし、長さに関係なく、最初の段落のみが TextView に表示されます。<p></p>これは、 HTMLタグと関係があると私も信じています。私は RSS フィードや XML の解析にあまり詳しくなく (これは初めての試みです)、私が達成しようとしていることを実行する方法を探し回っています。

このプロジェクトは、このブログの一連の投稿に基づいています: http://android-er.blogspot.com/2010/04/simple-rss-reader-in-listview.html

ここで提供されているプロジェクトを使用して、スワイプ テンプレートを使用してタブに追加し、一部の要素のレイアウト方法を変更しました。

免責事項: コメント付きの醜いコードがたくさんあります。それはほとんど私がレイアウトに入れたくなかったものです。記事のリストを含むフラグメントは次のとおりです。

public class AllStoriesFragment extends ListFragment {

    /*********************************************************************
     * RSS Async Task
     *********************************************************************/
    public class RssLoadingTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            displayRss();
        }

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

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

        @Override
        protected Void doInBackground(Void... arg0) {
            // TODO Auto-generated method stub
            readRss();
            return null;
        }

    }
    /*********************************************************************
     * End RSS Async Task
     *********************************************************************/

    private RSSFeed myRssFeed = null;

    TextView feedTitle;
    TextView feedDescription;
    //TextView feedPubdate;
    TextView feedLink;
    //TextView feedContent;

    /*********************************************************************
     * Custom Array Adapter 
     *********************************************************************/
    public class MyCustomAdapter extends ArrayAdapter<RSSItem> {
        public MyCustomAdapter(Context context, int textViewResourceId,
                List<RSSItem> list) {
            super(context, textViewResourceId, list);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            //return super.getView(position, convertView, parent);

            View row = convertView;

            if(row==null){
                LayoutInflater inflater=getActivity().getLayoutInflater();
                row=inflater.inflate(R.layout.row, parent, false);
            }

            TextView listTitle=(TextView)row.findViewById(R.id.listtitle);
            listTitle.setText(myRssFeed.getList().get(position).getTitle());
            TextView listPubdate=(TextView)row.findViewById(R.id.listpubdate);
            listPubdate.setText(myRssFeed.getList().get(position).getPubdate());

            if (position%2 == 0){
                listTitle.setBackgroundColor(0xff101010);
                listPubdate.setBackgroundColor(0xff101010);
            }
            else{
                listTitle.setBackgroundColor(0xff080808);
                listPubdate.setBackgroundColor(0xff080808);
            }

            return row;
        }
    }
    /*********************************************************************
     * End Custom Array Adapter 
     *********************************************************************/

   /** Called when the fragment is first created. */
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v =  inflater.inflate(R.layout.fragment_allstories, null);;

        feedTitle = (TextView)v.findViewById(R.id.feedtitle);
        feedDescription = (TextView)v.findViewById(R.id.feeddescription);
        //feedPubdate = (TextView)v.findViewById(R.id.feedpubdate);
        feedLink = (TextView)v.findViewById(R.id.feedlink);
        startReadRss();

        return v ;
    }

   private void startReadRss(){
       new RssLoadingTask().execute();
   }

   private void preReadRss(){
       setListAdapter(null);

       Toast.makeText(getActivity(), "Reading RSS, Please wait.", Toast.LENGTH_LONG).show();
   }

   private void readRss(){
       try {
           URL rssUrl = new URL("http://www.campusslate.com/feed/");
           SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
           SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
           XMLReader myXMLReader = mySAXParser.getXMLReader();
           RSSHandler myRSSHandler = new RSSHandler();
           myXMLReader.setContentHandler(myRSSHandler);
           InputSource myInputSource = new InputSource(rssUrl.openStream());
           myXMLReader.parse(myInputSource);

           myRssFeed = myRSSHandler.getFeed();
       } 
       catch (MalformedURLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } 
       catch (ParserConfigurationException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } 
       catch (SAXException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } 
       catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
    }

   private void displayRss(){

       if (myRssFeed!=null){

           MyCustomAdapter adapter = new MyCustomAdapter(getActivity(), R.layout.row, myRssFeed.getList());
           setListAdapter(adapter);
       }
   }


   public void onListItemClick(ListView l, View v, int position, long id) {
       // TODO Auto-generated method stub
       Intent intent = new Intent(getActivity(), ShowDetails.class);
   intent.putExtra("keyPubdate", myRssFeed.getItem(position).getPubdate());
   intent.putExtra("keyLink", myRssFeed.getItem(position).getLink());
   intent.putExtra("keyTitle", myRssFeed.getItem(position).getTitle());
   intent.putExtra("keyContent", myRssFeed.getItem(position).getContent());
       startActivity(intent);
   }

   public boolean onCreateOptionsMenu(Menu menu) {
       // TODO Auto-generated method stub
       menu.add(0, 0, 0, "Reload");
       return true;
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
       // TODO Auto-generated method stub
       switch(item.getItemId()){
       case (0): startReadRss();
       break;
       default:
           break;
       }
       return true;
   }  
}

これは、リスト内の項目がクリックされたときに開始されるアクティビティです。

package com.nick.pocketslate;

import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;

public class ShowDetails extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.details);
        TextView detailsTitle = (TextView)findViewById(R.id.detailstitle);
        TextView detailsPubdate = (TextView)findViewById(R.id.detailspubdate);
        TextView detailsLink = (TextView)findViewById(R.id.detailslink);
        TextView detailsContent = (TextView)findViewById(R.id.detailscontent);



        Intent intent = getIntent();
    detailsTitle.setText(intent.getStringExtra("keyTitle"));
    detailsPubdate.setText(intent.getStringExtra("keyPubdate"));
    detailsLink.setText(intent.getStringExtra("keyLink"));
    detailsContent.setText(Html.fromHtml(intent.getStringExtra("keyContent")));

    detailsContent.setMovementMethod(new ScrollingMovementMethod());

    }
}

この時点で、多くの検索を行いましたが、解決策が見つかりませんでした。コードのどの部分が問題を引き起こしているのかわかりません。誰かが見て問題を見つけることができる場合は、ここに私の完全なプロジェクトをダウンロードするためのリンクがあります。

誰かがどこから始めるべきかについて何らかのアイデアを持っている場合は、そのコードのセクションを掲載します。

https://lh.rs/zbdYev99O1G5

4

1 に答える 1

0

あなたが示したものは正しいように見えますが、あなたのモデルのコードはどこにありますか-RSSFeed?RSS読み取りが適切に動作しているかどうかを示すデバッグ出力を取得することをお勧めします。たぶん、あなたは完全な記事の代わりに要約だけを手に入れていますか?おそらく、記事全体は、要約されたRSSフィードからではなく、独自のリンクから読む必要がありますか?

HTMLコンテンツの場合、通常はLinkMovementMethodを使用するため、コンテンツ内のリンクは適切に処理されます。TextView.maxLinesプロパティを設定していない場合、TextViewsは自動的にスクロールします(これを確認することをお勧めします)。

また、簡単にするために、インテントから直接データを追加/読み取る必要があります。実際には、中間バンドルを経由する必要はありません。putExtra(String、String)およびgetStringExtra(String)または、RSSReaderから正確に出力される内容に応じて、同等のCharSequenceを使用できます。

編集: TextViewが通常、5行より長いダミーテキストを表示してスクロールすることを確認していますか?また、フィードからコンテンツデータを外部からコピーし(外部フィードリーダーを介して)、TextView.setText(CharSequence)を使用してTextViewに明示的に配置し、フィード自体に問題が発生していないかどうかを確認することもできます。

(Html.fromHtmlはTagSoupに基づいており、形式の悪いHTMLでも処理できるように設計されていますが、いつでもプレーンテキストでテストして、それが機能するかどうかを確認できます。デバッグログ/LogCatを使用して前を確認することもできます。 / HTMLの後で-RSSフィードコンテンツを解析します。)

これらに問題がある場合は、TextViewのレイアウト/初期化に問題がある可能性があります。これらがすべて機能する場合は、RSS関連のコードのどこかに問題があることがわかります。

詳細ビューのレイアウトコードを投稿できますか?また、エミュレータを使用していますか、それとも実際の電話を使用していますか?エミュレータが実際のデバイスとまったく同じようにスクロールジェスチャに応答しない場合があります。

編集:問題がRSSHandlerである場合は、適切にタグ付けされた別の/新しい質問(SAX、XMLパーサー、RSS)を作成することをお勧めします。その新しい質問へのリンクをここに投稿していただければ、あちらでお手伝いさせていただきます。また、XML解析へのSAXアプローチに役立つ可能性のある特定の回答を最初に探すこともできます。これが私が最近使っている良いチュートリアルです-http ://tutorials.jenkov.com/java-xml/sax.html

于 2012-12-03T21:34:36.327 に答える