Android - ClassCastException - 从LinearLayout到AbsListView的LayoutParams

时间:2012-07-15 14:23:03

标签: android android-listview

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

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>

6 个答案:

答案 0 :(得分:36)

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

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

或者,从getView返回行而不是(因为我认为你现在正在做,因为你已经从你的引用代码中删除了返回行)返回电视。

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

答案 1 :(得分: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!

答案 2 :(得分:5)

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

LayoutInflater li = LayoutInflater.from(context);
View rootView = li.inflate(R.layout.item, null);

答案 3 :(得分: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);

另外,如果可能,请不要在代码中手动进行垃圾回收。

答案 4 :(得分:0)

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

 dataItem.OtherFields["Price"].ToString("0.00000")

答案 5 :(得分:-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;
}