简体   繁体   中英

Android Display HTML in a ListView

Sorry if this is obvious to everyone else but I am having a minor difficulty understanding how to display html inside my listview.

My list view is declared.

ListView lv1 = (ListView) findViewById(R.id.ListView01);

I populate it (not shown) then set my listview here with an ArrayAdapter.

lv1.setAdapter(new ArrayAdapter<String>(SearchByFood.this, R.layout.new_list_view, foods));

Further down I create a new array of strings that I want to have bold tags in. I then add this new array (called arr_sort) to the arrayadapter insdie a onTextChanged() method.

lv1.setAdapter(new ArrayAdapter<String>(SearchByFood.this, R.layout.new_list_view, arr_sort));

So now that my new Array of Strings has < b > tags in it. How do I make my listview display the bold text?

Here is my new_list_view

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/grey2"
    android:textSize="20sp"
    android:gravity="center_vertical"
    android:paddingLeft="6dip"
    android:minHeight="40dip"
/> 

And here is my ListView part in my main layout.

        <ListView
        android:id="@+id/ListView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/rounded_corners_green"
        android:cacheColorHint="#00000000"
        android:divider="@color/green6"
        android:dividerHeight="1px"
        android:fastScrollEnabled="true" >
    </ListView>

Any help would be much appreciated.

Ok, so Jitendra Sharma was had the right idea for my scenario, but I needed to override the getView method. Or at least that is what worked for me. Then in the getView method I was able to set my text to render in html.

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(SearchByFood.this, R.layout.new_list_view, arr_sort)
            {
                @Override
                public View getView(int position, View convertView, ViewGroup parent) 
                {
                    View row;

                    if (null == convertView) {
                    row = mInflater.inflate(R.layout.new_list_view, null);
                    } else {
                    row = convertView;
                    }

                    TextView tv = (TextView) row.findViewById(android.R.id.text1);
                    tv.setText(Html.fromHtml(getItem(position)));
                    //tv.setText(getItem(position));

                    return row;
                }

            };
            lv1.setAdapter(adapter);

If you are using a SimpleAdapter, here is the code that enables HTML on a TextView.

adapter.setViewBinder(new SimpleAdapter.ViewBinder() {  
    public boolean setViewValue(View view, Object data, String textRepresentation) {  
        if (data instanceof Spanned && view instanceof TextView) {  
            ((TextView) view).setText((Spanned) data);  
        } else {  
            ((TextView) view).setText(Html.fromHtml(String.valueOf(data))); 
        }  
        return true;  
        }  
    }  
); 

Ref: [Link] ( http://android.jreactor.com/2012/07/17/simpleadapter-spanned-html-fromhtml/ )

override getItem method of the Adapter and do the following:

ArrayAdapter<String> adapter= ArrayAdapter<String>(SearchByFood.this, R.layout.new_list_view, arr_sort){
     public Object getItem(int position)
     {
          return Html.fromHtml(arr_sort.get(position));
     }
};

If all you wanted is to display some text where parts of the text should be bold, all you need is one TextView, and properly formatted text (with <b> added) and do the following:

textview.setText(Html.fromHtml(text));

For more information on what TextView+Html can support, see here

If you have the possibility of loading your texts from strings.xml, adding the tag there will automatically bold your text. If however your texts are dynamic, you will have to create a custom adapter , and in it to set the text using textView.setText(Html.fromHtml(yourText));

ArrayAdapter<Spanned> listAdapter = new ArrayAdapter<Spanned>(MyActivity.this, R.layout.row);
listAdapter.add(Html.fromHtml(htmlText));
listAdapter.add(Html.fromHtml(htmlText));
...

如果您将ksoap用于来自任何数据库引擎的html数据

yourVariable=String.valueOf(Html.fromHtml(ic.getProperty(0).toString()))
    adapter = new ArrayAdapter<String>(rr.getContext(),android.R.layout.simple_list_item_1,titulos)
    {
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            View row;

            if (null == convertView) {
                row = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, null);
            } else {
                row = convertView;
            }
            TextView tv = (TextView) row.findViewById(android.R.id.text1);
            tv.setText(Html.fromHtml(getItem(position)));
            return row;
        }
    };
    lista.setAdapter(adapter);

This also works and is perphaps a lot simpler. First, pass your data from String[] to Spanned[]

Spanned[] myhtmldata = new Spanned[mydata.length];
for(int i = 0 ; i < mydata.length; i++) {
myhtmldata[i] = Html.fromHtml(mydata[i]);
}

Then declare the ArrayAdapter using the CharSequence parameter

ArrayAdapter<CharSequence> linksadapter = new ArrayAdapter<CharSequence>(getActivity(), R.layout.list_item, R.id.textview, myhtmldata);         
setListAdapter(linksadapter);

Borrowed from here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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