Android 如何在ListView中将webview作为行加载?

Android 如何在ListView中将webview作为行加载?,android,listview,android-webview,Android,Listview,Android Webview,我使用自定义适配器为一个ListView行加载不同的布局。我使用的自定义布局包含一个Webview。但是当我将其充气并检查webview的高度和宽度时,结果是零,并且webview在Listview中也不可见。 谁能告诉我我做错了什么? MyCustomListAdapter getView函数如下 @Override public View getView(int position, View convertView, ViewGroup parent) { View v = conv

我使用自定义适配器为一个ListView行加载不同的布局。我使用的自定义布局包含一个Webview。但是当我将其充气并检查webview的高度和宽度时,结果是零,并且webview在Listview中也不可见。 谁能告诉我我做错了什么? MyCustomListAdapter getView函数如下

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    int type = getItemViewType(position);
    if (v == null) {
        // Inflate the layout according to the view type
        LayoutInflater inflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (type == 0) {
            v = inflater.inflate(R.layout.list_row_web, parent, false);
            WebView wv = (WebView) v.findViewById(R.id.webview1);
            String html="<html><body>Hello World</body></html>";
            wv.loadData(html, "text/html", "utf-8");
            System.out.println(wv.getWidth());
            System.out.println(wv.getHeight());              
        } else {
            v = inflater.inflate(R.layout.list_row_default, parent, false);
            TextView title = (TextView) v.findViewById(R.id.textView1);
            TextView desc = (TextView) v.findViewById(R.id.textView2);
            title.setText("Title");
            desc.setText("Description");
        }
    }
    return v;
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
int type=getItemViewType(位置);
如果(v==null){
//根据视图类型对布局进行充气
LayoutInflater充气机=(LayoutInflater)ctx
.getSystemService(上下文布局\充气机\服务);
如果(类型==0){
v=充气机充气(R.layout.list\u row\u web,父项,false);
WebView wv=(WebView)v.findviewbyd(R.id.webview1);
字符串html=“Hello World”;
wv.loadData(html、“文本/html”、“utf-8”);
System.out.println(wv.getWidth());
System.out.println(wv.getHeight());
}否则{
v=充气机充气(R.layout.list\u row\u默认值,父项,false);
TextView title=(TextView)v.findViewById(R.id.textView1);
TextView desc=(TextView)v.findViewById(R.id.textView2);
title.setText(“title”);
desc.setText(“说明”);
}
}
返回v;
}
我的列表\u行\u web.xml

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

        <WebView
              android:id="@+id/webView1"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@android:color/transparent"
              android:layerType="software" />
      </LinearLayout>

我想提到的是,我实际上是先发出一个HTTPPOST请求,然后将从服务器得到的响应加载到我的webview中。
硬编码的HTML字符串可以工作,但是对于请求方法,我确实使用loadurl()函数将HTML字符串加载到webview中,但是没有出现任何结果,该行根本不会显示。

每一行中膨胀一个新的XML,这对性能不利。最好使用带有单个
XML
静态保持器。您只需根据
类型
变量隐藏/显示
文本视图
/
网络视图

如果您坚持使用您的代码,请在以下情况下尝试删除此

if (v == null)

你在以一种糟糕的方式回收你的排。使用类似以下内容:

LISTITEM_ROW.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/visualizer_background"
    android:paddingBottom="20dp"
    android:paddingTop="20dp" >

...

<WebView
    android:id="@+id/newsListContent"
    android:background="@color/transparent"
    android:layerType="software"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:layout_below="@+id/newsListTitle"
    android:layout_marginLeft="15dp"
    android:layout_marginRight="10dp"
    android:layout_toRightOf="@+id/newsListImage" />

...

</RelativeLayout>

...
...
您可以选择以下适配器:

public class FragmentNewsListAdapter extends BaseAdapter implements OnClickListener {

private final ArrayList<RadioMarcaNew> noticias;
private static LayoutInflater inflater=null;
private Activity act;

public FragmentNewsListAdapter(Activity act, ArrayList<RadioMarcaNew> d){

    this.act=act;
    this.noticias = d;
    inflater = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View vi = convertView;
    if(act!=null) {

        final NewsViewHolder holder;
        if (convertView == null) {

            vi = inflater.inflate(R.layout.listitem_news, null);
            holder = new NewsViewHolder();

            ...
            holder.content = (WebView) vi.findViewById(R.id.newsListContent);
            ...

            vi.setTag(holder);
        } else holder = (NewsViewHolder)vi.getTag();

        final RadioMarcaNew noticia = noticias.get(position);

        ...
        if(noticia.getHTMLContent()!=null && noticia.getHTMLContent().length()>0) {

            holder.content.setWebViewClient(new MyWebViewClient());
            holder.content.loadDataWithBaseURL(null,cadenaHTML, "text/html","utf-8", null);
            holder.content.setBackgroundColor(act.getResources().getColor(R.color.transparent));
            holder.content.setEnabled(false);
        }
        ...

    }
    return vi;
}

class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {

        super.onPageFinished(view, url);
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {

        super.onPageStarted(view, url, favicon);
    }

    @Override
    public void onLoadResource(WebView view, String url) {

        super.onLoadResource(view, url);

    }
}

@Override
public int getCount() {

    return this.noticias.size();
}

@Override
public Object getItem(int position) {

    return position;
}

@Override
public long getItemId(int position) {

    return position;
}
}

class NewsViewHolder {

    ...
    public WebView content;
    ...
}
公共类FragmentNewsListAdapter扩展BaseAdapter实现OnClickListener{
私人最终审裁名单通知;
专用静态充气机=空;
私人活动法;
公共碎片新闻列表适配器(活动法案,ArrayList d){
这个动作=动作;
这个。noticias=d;
充气机=(LayoutFlater)act.getSystemService(Context.LAYOUT\u充气机\u服务);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
if(act!=null){
最终新闻持有人;
if(convertView==null){
vi=充气机。充气(R.layout.listitem_news,null);
holder=新的NewsViewHolder();
...
holder.content=(WebView)vi.findViewById(R.id.newsListContent);
...
vi.setTag(支架);
}else holder=(NewsViewHolder)vi.getTag();
最终RADIOMACANEW NOTIIA=NOTIIAS.get(位置);
...
if(noticia.getHTMLContent()!=null&¬icia.getHTMLContent().length()>0){
setWebViewClient(新的MyWebViewClient());
holder.content.loadDataWithBaseURL(null,cadenaHTML,“text/html”,“utf-8”,null);
setBackgroundColor(act.getResources().getColor(R.color.transparent));
holder.content.setEnabled(false);
}
...
}
返回vi;
}
类MyWebViewClient扩展了WebViewClient{
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){
返回true;
}
@凌驾
公共void onPageFinished(WebView视图,字符串url){
super.onPageFinished(视图、url);
}
@凌驾
public void onPageStarted(WebView视图、字符串url、位图favicon){
super.onPageStarted(视图、url、favicon);
}
@凌驾
public void onLoadResource(WebView视图,字符串url){
super.onLoadResource(视图、url);
}
}
@凌驾
public int getCount(){
返回此.notifias.size();
}
@凌驾
公共对象getItem(int位置){
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
}
类新闻浏览者{
...
公共网络视图内容;
...
}

最后,您应该更改listview高度以匹配_parent=)

是否可以放入完整的代码?加载元素时滚动一个元素到另一个元素中不是一个好的做法。要获得良好的性能,您需要在网络视图或列表视图本身中禁用滚动。@MoradiyaAkash我希望我已经给了您需要注意的确切代码。@Lucianodríguez我理解您对性能的担忧,但这仍然不能回答我的问题,即为什么webview不能在布局中工作。我肯定会修改我的代码来解决你刚才指出的问题。我知道我的评论不能回答你的问题。因此,这是一个注释,而不是答案=)。根据您的需要,您可以尝试使用以下命令将HTML内容加载到TextView中:TextView.setText(HTML.fromHtml(HTML_content));你能更具体地说明你打算怎么做吗。我只想用自定义布局更改Listview中的一行。我删除了if语句,当前情况没有变化。行中仍然没有任何内容,并且高度和宽度等于0高度和宽度是什么?网络视图?你能发布列表吗?是的,这是我在代码中给出的,请在System.out.println(wv.getWidth())上方检查它;System.out.println(wv.getHeight());我再也看不到你的布局文件的内容了