17

我有一个列表适配器,如果我不使用通货膨胀(通过应用程序上下文直接识别 textview),我正在尝试为(item.xml)设置自定义 xml,它可以完美运行.. 但是我的列表视图不能主题..

public View getView(int position, View convertView, ViewGroup parent) {
        //System.gc();
        TextView tv;

        LayoutInflater inflater = getLayoutInflater();

        View row = View.inflate(mContext,R.layout.item,null); //.inflate(R.layout.item, parent, false); doesnt work either..
        String id = null;
        if (convertView == null) {
            tv =  (TextView) row.findViewById(R.id.TextView01);;
        } else
            tv = (TextView) convertView;

[..]

logcat我得到这个..

    07-15 19:45:51.710: ERROR/AndroidRuntime(20185): FATAL EXCEPTION: main
        java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
        at android.widget.ListView.setupChild(ListView.java:1827)
        at android.widget.ListView.makeAndAddView(ListView.java:1794)
        at android.widget.ListView.fillDown(ListView.java:688)

我的 item.xml 文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_height="wrap_content"
          android:gravity="left|center"
          android:layout_width="fill_parent"
          android:paddingBottom="15px"
          android:background="#fff200"
          android:paddingTop="15px"
          android:paddingLeft="15px">

<TextView android:id="@+id/TextView01"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:textSize="40px"
          android:textStyle="bold"
          android:layout_marginLeft="20px"
          android:textColor="#0099CC">
</TextView>
</LinearLayout>
4

6 回答 6

36

问题是由于将您从适配器返回的控件包装在线性布局中引起的。从布局文件中丢失 LinearLayout(只需将 TextView 作为根),我认为它应该可以工作。

稍微扩展一下:您正在创建控件,然后将其添加到 LinearLayout 中。此时为其分配了一个 LinearLayout$LayoutParams 对象并将其设置为它的布局参数。然后,您将其从线性布局中拉出并放入您的列表视图中,该列表视图不理解 LinearLayout$LayoutParams。

或者,从 getView 返回 row 而不是(正如我假设你现在正在做的那样,因为你已经从引用的代码中删除了返回行)返回 tv.

(另一个不相关的提示:您正在膨胀布局,然后在 convertView != null 时将其丢弃;这将导致慢速设备上的滚动性能不佳。只有在您真正需要时才执行膨胀。)

于 2012-07-15T16:20:39.023 回答
20

您可能正在退回电视而不是行

public View getView(int position, View convertView, ViewGroup parent) {
    TextView tv;

    LayoutInflater inflater = getLayoutInflater();
    View row = View.inflate(mContext,R.layout.item,null);
    String id = null;
    if (convertView == null) {
        tv =  (TextView) row.findViewById(R.id.TextView01);;
    } else
        tv = (TextView) convertView;
    }
 return row;  // returning tv brings to ClassCast!
于 2012-09-09T11:58:17.233 回答
5

您是否尝试使用布局充气器来充气静态 xml 布局?像这样:

LayoutInflater li = LayoutInflater.from(context);
View rootView = li.inflate(R.layout.item, null);
于 2012-07-15T14:38:24.647 回答
0

为您的代码使用 ArrayAdapter 的 getView 的正确方法是:

public View getView(int position, View convertView, ViewGroup parent) {
    //System.gc(); // Should not manually call gc
    View row;
    LayoutInflater inflater = getLayoutInflater();
    if (convertView == null) {
        row = inflater.inflate(R.layout.item, parent, false);
    } else
        row = convertView;

    TextView tv = (TextView) row.findViewById(R.id.TextView01);

此外,如果可能,请勿在代码中手动进行垃圾收集。

于 2012-07-15T14:34:12.957 回答
0

我有同样的问题,我使用了这些代码:

public View getView(final int position, View convertView, ViewGroup parent) {
    convertView = G.layoutInflater.inflate(R.layout.list_lay_cities_markets, null);

    // your work 

    notifyDataSetChanged();
    return convertView;
}
于 2017-05-21T07:13:43.610 回答
-1

这是正确的:

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    final ViewHolder holder;

    if(view==null){
        vi = inflater.inflate(R.layout.listview_row_myvideos,null);
        holder = new ViewHolder();
        holder.tv =  (TextView) vi.findViewById(R.id.TextView01);

        vi.setTag(holder);
    }else{
        holder = (ViewHolder)vi.getTag();
    }
    return vi;
}

public class ViewHolder{
    TextView tv;
}
于 2015-12-15T01:16:45.943 回答