android - Android 中的跨区格式和 html 格式

标签 android

我需要在 android 应用程序的 html 输出中格式化这个字符串:

<a href=http://www.mywebpage.net?ID=764>My remote pics</a>

并在 ListView 中尝试了 Spanned 方法:

Spanned varHtml = Html.fromHtml(var.toString());

ArrayList<String> planetList = new ArrayList<String>();
planetList.addAll(Arrays.asList(varHtml));

listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow,
        R.id.rowTextView, planetList);
listAdapter.addAll(varHtml.toString());
mainListView.setAdapter(listAdapter);

但是我在这一行中有这个错误,为什么?

listAdapter.addAll(varHtml.toString());

错误

The method addAll(Collection<? extends String>) in the
type ArrayList<String> is not applicable for the
arguments (List<Spanned>)

编辑

ListView动态数据的完整java类:

public class news extends Activity {

    private static final String SOAP_ACTION = "http://www.xxxxx.com/WebService/GetNews";
    private static final String OPERATION_NAME = "GetNews";
    private static final String WSDL_TARGET_NAMESPACE = "http://www.xxxxx.com/GetNews";
    private static final String SOAP_ADDRESS = "http://www.xxxxx.com/GetNews.asmx";

    private ListView mainListView;
    private ArrayAdapter<String> listAdapter;

    @SuppressLint("NewApi")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mains);

        mainListView = (ListView) findViewById(R.id.mainListView);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);

        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                OPERATION_NAME);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);

        envelope.dotNet = true;
        envelope.implicitTypes = false;
        envelope.setOutputSoapObject(request);

        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
        httpTransport.debug = true;
        envelope.setOutputSoapObject(request);

        try {

            httpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

                    //Remote string
            String RemoteString = response.toString();
            Log.i("RemoteString", RemoteString.toString());

                    //Replace in remote string
            String RemoteStringnew = RemoteString.replaceAll("<br />", "\n");
            Log.i("RemoteStringnew", RemoteStringnew);

                    //Split in remote string
            String[] var = RemoteStringnew.split("\n");

                    //Spanned in remote string
            Spanned varHtml = Html.fromHtml(var.toString());
            Log.i("varHtml", varHtml.toString());

            ArrayList<String> planetList = new ArrayList<String>();
            planetList.addAll(Arrays.asList(varHtml.toString()));

            listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow,
                    R.id.rowTextView, planetList);
            listAdapter.add(varHtml.toString());
            mainListView.setAdapter(listAdapter);

        } catch (Exception exception) {
                 Log.i("Error:  ", exception.toString());
        }
    }
}

编辑

远程字符串是:

https://www.LinkFromImageonTheGoogle.net/myImage.png<br />23/03/2014<br /><a href=http://www.mywebpage.net?ID=764>My remote pics</a><br /><br />

https://www.LinkFromImageonTheGoogle.net/myImage1.png<br />22/03/2014<br /><a href=http://www.mywebpage.net?ID=765>My remote pics 1</a><br /><br />

https://www.LinkFromImageonTheGoogle.net/myImage2.png<br />21/03/2014<br /><a href=http://www.mywebpage.net?ID=766>My remote pics 2</a><br /><br />

编辑 2

private ListView mainListView;
private ArrayAdapter<String> listAdapter;

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mains);

    mainListView = (ListView) findViewById(R.id.mainListView);

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();
    StrictMode.setThreadPolicy(policy);

    SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
            OPERATION_NAME);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);

    envelope.dotNet = true;
    envelope.implicitTypes = false;
    envelope.setOutputSoapObject(request);

    HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
    httpTransport.debug = true;
    envelope.setOutputSoapObject(request);

    try {

        httpTransport.call(SOAP_ACTION, envelope);
        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

        // Remote string
        String RemoteString = response.toString();
        Log.i("RemoteString", RemoteString.toString());

        // Replace in remote string
        // it's not needed
        RemoteString = RemoteString.replaceAll("<br />", "\n");
        Log.i("RemoteStringnew", RemoteString);

        // Split in remote string
        String[] var = RemoteString.split("\\\\r?\\\\n");// new line

        // Spanned in remote string

        ArrayList<String> planetList = new ArrayList<String>();

        listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow,
                R.id.rowTextView, planetList);
        // listAdapter.add(varHtml.toString());

        for (String html : var) {
            Spanned varHtml = Html.fromHtml(html);

            Object[] strings = varHtml.getSpans(0, html.length(),
                    Object.class);

            // List<String> urls = new ArrayList<String>();
            for (Object obj : strings) {
                if (obj instanceof URLSpan) {
                    URLSpan urlSpan = (URLSpan) obj;

                    planetList.add(urlSpan.getURL());
                }
            }
        }

        mainListView.setAdapter(listAdapter);

    } catch (Exception exception) {
        Log.i("Error:  ", exception.toString());
    }
}

编辑 3

我需要这个输出:

https://www.LinkFromImageonTheGoogle.net/myImage.png ( I need show the image not link to image )
23/03/2014
My remote pics (with link active http://www.mywebpage.net?ID=764)


https://www.LinkFromImageonTheGoogle.net/myImage1.png ( I need show the image not link to image )
22/03/2014
My remote pics 1 (with link active http://www.mywebpage.net?ID=765)


https://www.LinkFromImageonTheGoogle.net/myImage2.png ( I need show the image not link to image )
21/03/2014
My remote pics 2 (with link active http://www.mywebpage.net?ID=766)

编辑 4

ma​​ins.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

    <ListView android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:id="@+id/mainListView">
    </ListView>

</LinearLayout>

simplerow.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/rowTextView" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content"
 android:padding="10dp"
 android:textSize="16sp" >
</TextView>

最佳答案

addAll想要一个 Collection要添加的项目。

你应该使用 add在这种情况下采用 String 的方法。

Appends the specified element to the end of this list.


改变

listAdapter.addAll(varHtml.toString());

listAdapter.add(varHtml.toString());

这就是你应该做的事

String html = "<a href=http://www.mywebpage.net?ID=764>My remote pics</a>"; // the HTML to read
Spanned spanned = Html.fromHtml(html);

Object[] strings = spanned.getSpans(0, html.length(), Object.class);

List<String> urls = new ArrayList<String>();
for (Object obj : strings)
{
    if (obj instanceof URLSpan)
    {
        URLSpan urlSpan = (URLSpan) obj;

        urls.add(urlSpan.getURL());
    }
}

它将读取每个 Url 并将所有内容添加到 urls 列表中。您可以直接更新您的列表或做

listAdapter.addAll(urls);

这就是你能做到的;

public class news extends Activity {

    private static final String SOAP_ACTION = "http://www.xxxxx.com/WebService/GetNews";
    private static final String OPERATION_NAME = "GetNews";
    private static final String WSDL_TARGET_NAMESPACE = "http://www.xxxxx.com/GetNews";
    private static final String SOAP_ADDRESS = "http://www.xxxxx.com/GetNews.asmx";

    private ListView mainListView;
    private ArrayAdapter<String> listAdapter;

    @SuppressLint("NewApi")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mains);

        mainListView = (ListView) findViewById(R.id.mainListView);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);

        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                OPERATION_NAME);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);

        envelope.dotNet = true;
        envelope.implicitTypes = false;
        envelope.setOutputSoapObject(request);

        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
        httpTransport.debug = true;
        envelope.setOutputSoapObject(request);

        try {

            httpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

            //Remote string
            String RemoteString = response.toString();
            Log.i("RemoteString", RemoteString.toString());

            //Replace in remote string
            // it's not needed
            RemoteString = RemoteString.replaceAll("<br />", "\n");
            Log.i("RemoteStringnew", RemoteString);

            //Split in remote string
            String[] var = RemoteString.split("\\\\r?\\\\n");// new line

            //Spanned in remote string

            ArrayList<String> planetList = new ArrayList<String>();

            listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow,
                    R.id.rowTextView, planetList);
            listAdapter.add(varHtml.toString());

            for (String html : var)
            {
                Spanned varHtml = Html.fromHtml(html);

                Object[] strings = varHtml.getSpans(0, html.length(), Object.class);

                List<String> urls = new ArrayList<String>();
                for (Object obj : strings)
                {
                    if (obj instanceof URLSpan)
                    {
                        URLSpan urlSpan = (URLSpan) obj;

                        planetList.add(urlSpan.getURL());
                    }
                }
            }

            mainListView.setAdapter(listAdapter);

        } catch (Exception exception) {
            Log.i("Error:  ", exception.toString());
        }
    }
}

关于android - Android 中的跨区格式和 html 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23031605/

相关文章:

php - RSA 安卓加密/RSA PHP 解密

android - 如何在 Android 中的 Facebook 页面墙上发帖?

java - 长时间运行android后台服务

Android CheckBoxPreference - 取消/选中所有首选项

java - 切换按钮 onCheckChangeListener

java - 检查文件的 MD5

android - Android 是否广播操作系统更新的 Intent ?

android - 将 Android 项目从 git 加载到 Eclipse

android - 以编程方式启用/禁用 Android 设备上的辅助功能设置

android - Android无法杀死的进程?