繁体   English   中英

Android在listview中的textview中显示html

[英]Android display html in textview inside a listview

我在文本视图中显示我的html数据。 在ListView中,它显示原始HTML。

这是图片:

在此输入图像描述在此输入图像描述

我的文章活动:

    package net.biscani.dino;

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

public class ArticleActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.single_article);

        Intent in = getIntent();

        String name = in.getStringExtra(GetArticles.KEY_TITLE);
        String content = in.getStringExtra(GetArticles.KEY_CONTENT);

        TextView lblName = (TextView) findViewById(R.id.name_label);
        TextView lblDesc = (TextView) findViewById(R.id.content_label);

        lblName.setText(name);
        lblDesc.setText(Html.fromHtml(content));
        lblDesc.setMovementMethod(ScrollingMovementMethod.getInstance());
    }
}

这也是我的MainActivity:

        package net.biscani.dino;

    import android.support.v7.app.ActionBarActivity;
    import java.util.ArrayList;
    import java.util.HashMap;

    import net.biscani.dino.ArticleActivity;
    import net.biscani.dino.GetArticles;
    import net.biscani.dino.MainActivity;
    import net.biscani.dino.R;

    import android.app.ListActivity;
    import android.app.LoaderManager.LoaderCallbacks;
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.content.Loader;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.TextView;
    import android.view.Menu;
    import android.view.MenuItem;


    public class MainActivity extends ListActivity {

        private static int LOADER_NUM = 1;
        private ProgressDialog mPd;
        private ListAdapter mAdapter;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            mPd = new ProgressDialog(this);

            ListView lv = getListView();

            lv.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    String title = ((TextView) view.findViewById(R.id.title))
                            .getText().toString();
                    String content = ((TextView) view
                            .findViewById(R.id.content)).getText().toString();

                    Intent in = new Intent(getApplicationContext(),
                            ArticleActivity.class);
                    in.putExtra(GetArticles.KEY_TITLE, title);
                    in.putExtra(GetArticles.KEY_CONTENT, content);
                    startActivity(in);
                }
            });

            getLoaderManager().restartLoader(LOADER_NUM, Bundle.EMPTY,
                    mLoaderCallbacks);

        }

        private LoaderCallbacks<ArrayList<HashMap<String, String>>> mLoaderCallbacks = new LoaderCallbacks<ArrayList<HashMap<String, String>>>() {

            @Override
            public Loader<ArrayList<HashMap<String, String>>> onCreateLoader(
                    int id, Bundle args) {

                mPd.show();

                return new GetArticles(MainActivity.this);
            }

            @Override
            public void onLoadFinished(
                    Loader<ArrayList<HashMap<String, String>>> loader,
                    ArrayList<HashMap<String, String>> articles) {

                mAdapter = new SimpleAdapter(MainActivity.this, articles,
                        R.layout.list_item, new String[] { GetArticles.KEY_TITLE,
                                GetArticles.KEY_CONTENT }, 
                                new int[] {
                                R.id.title, R.id.content });

                setListAdapter(mAdapter);

                mPd.dismiss();
            }

            @Override
            public void onLoaderReset(
                    Loader<ArrayList<HashMap<String, String>>> loader) {
            }
        };


        @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;
        }

        @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();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

my ArticleActivity:

package net.biscani.dino;

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

public class ArticleActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.single_article);

        Intent in = getIntent();

        String name = in.getStringExtra(GetArticles.KEY_TITLE);
        String content = in.getStringExtra(GetArticles.KEY_CONTENT);

        TextView lblName = (TextView) findViewById(R.id.name_label);
        TextView lblDesc = (TextView) findViewById(R.id.content_label);

        lblName.setText(name);
        lblDesc.setText(Html.fromHtml(content));
        lblDesc.setMovementMethod(ScrollingMovementMethod.getInstance());
    }
}

和我的GetArticles.java:

    package net.biscani.dino;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import android.content.AsyncTaskLoader;
import android.content.Context;
import android.util.Log;

public class GetArticles extends
        AsyncTaskLoader<ArrayList<HashMap<String, String>>> {
    private static final String TAG = GetArticles.class.getSimpleName();

    static final String URL = "http://www.biscani.net/feed/";
    static final String KEY_ITEM = "item";
    static final String KEY_TITLE = "title";
    static final String KEY_CONTENT = "content:encoded";

    public GetArticles(Context context) {
        super(context);
    }

    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Override
    public ArrayList<HashMap<String, String>> loadInBackground() {

        ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

        try {

            URL url = new URL(URL);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new InputSource(url.openStream()));
            doc.getDocumentElement().normalize();

            NodeList nodeList = doc.getElementsByTagName(KEY_ITEM);

            for (int i = 0; i < nodeList.getLength(); i++) {

                Node node = nodeList.item(i);

                Element fstElmnt = (Element) node;
                NodeList nameList = fstElmnt.getElementsByTagName(KEY_TITLE);
                Element nameElement = (Element) nameList.item(0);
                nameList = nameElement.getChildNodes();

                Log.d("", "Name = " + ((Node) nameList.item(0)).getNodeValue());

                NodeList contentList = fstElmnt
                        .getElementsByTagName(KEY_CONTENT);
                Element contentElement = (Element) contentList.item(0);
                contentList = contentElement.getChildNodes();

                Log.d("",
                        "Content = "
                                + ((Node) contentList.item(0))
                                        .getNodeValue());

                HashMap<String, String> map = new HashMap<String, String>();
                map.put(KEY_TITLE, ((Node) nameList.item(0)).getNodeValue());
                map.put(KEY_CONTENT,
                        ((Node) contentList.item(0)).getNodeValue());

                menuItems.add(map);
            }
        } catch (Exception e) {
            System.out.println("XML Pasing Excpetion = " + e);
        }

        return menuItems;
    }
}

ListView项目布局list_item.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <!-- Name Label -->

        <TextView
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingTop="1dp"
            android:textColor="#dc6800"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/content"
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:ellipsize="end"
            android:scrollbars="none"
            android:textColor="#acacac" >

        </TextView>
    </LinearLayout>

</LinearLayout>

当我在一篇文章上,它可以工作,HTML被转换。 但是当我在列表视图中时,它不会转换它。 我怎么能解决这个问题?

提前致谢。

您需要为列表编写自己的Adapter子类,以便它可以将描述呈现为HTML。 SimpleAdapter类不会为您执行此操作 - 它将编码的HTML视为普通字符串,并且不知道将其呈现为HTML。

自定义适配器看起来像这样:

private class ArticleAdapter extends ArrayAdapter<HashMap<String, String>> {

    private ArticleAdapter(ArrayList<HashMap<String, String>> list) {
        super(MainActivity.this, R.layout.list_item, list);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        if (row == null) {
            LayoutInflater inflater = MainActivity.this.getLayoutInflater();
            row = inflater.inflate(R.layout.list_item, parent, false);
        }
        HashMap<String, String> article = getItem(position);
        ((TextView)row.findViewById(R.id.title)).setText(article.get(GetArticles.KEY_TITLE));
        ((TextView)row.findViewById(R.id.content)).setText(Html.fromHtml(article.get(GetArticles.KEY_CONTENT)));
        return row;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM