Android 如何在ListView中将webview作为行加载?
我使用自定义适配器为一个ListView行加载不同的布局。我使用的自定义布局包含一个Webview。但是当我将其充气并检查webview的高度和宽度时,结果是零,并且webview在Listview中也不可见。 谁能告诉我我做错了什么? MyCustomListAdapter getView函数如下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
@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());我再也看不到你的布局文件的内容了