1

下午好,

我之前用其他适配器(如 SimpleAdapter)问过这个问题,但简单适配器的解决方案不适用于 ArrayAdapter。在 SimpleAdapter 中,我得到了屏幕宽度和高度,然后将其传递给了数据行的 RelativeLayout。效果是一次只显示一个填满整个屏幕的记录。静态数据很好,但现在我想使用可变数据。简而言之,我真的不想传递高度和宽度。我的 xml 布局使用 dip 所以屏幕尺寸可以随心所欲地改变。我真正追求的是一种方法来控制一次只对一条记录的 getView 调用。

无论如何,使用 SimpleAdapter 的解决方法,我认为像以前一样传递高度和宽度会起作用,但由于某种原因,这次我遇到了一个我无法弄清楚的错误。这是设置宽度和高度的代码:

RelativeLayout.LayoutParams szParms = new RelativeLayout.LayoutParams(mWidth, mHeight);
vw_BigRow.setLayoutParams(szParms);

高度和宽度在其他地方确定,并且在我测试过的所有设备上都是准确的。不太确定还要发布什么,所以只要告诉我,我就会将该代码/信息添加到问题中。

E/AndroidRuntime(404): FATAL EXCEPTION: main
E/AndroidRuntime(404): java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams

编辑: 正如已经正确指出的那样,我的错误发生在 CastClassException 但是我仍然没有正确完成分配,因为我继续收到错误。我尝试在活动中使用以下内容设置高度/宽度:

AbsListView.LayoutParams szParms = new AbsListView.LayoutParams(mWidth, mHeight);
lstvw_LiftData.setLayoutParams(szParms);

E/AndroidRuntime(1886): FATAL EXCEPTION: main
E/AndroidRuntime(1886): java.lang.ClassCastException: android.widget.AbsListView$LayoutParams

ListView.LayoutParams szParms = new ListView.LayoutParams(mWidth, mHeight);
lstvw_LiftData.setLayoutParams(szParms);

E/AndroidRuntime(1886): FATAL EXCEPTION: main
E/AndroidRuntime(1886): java.lang.ClassCastException: android.widget.AbsListView$LayoutParams

lstvw_LiftData 是一个有效的参考而不是空值。

在 ArrayAdapter 的 getView() 覆盖内,我还尝试设置具有相同结果的值 @Override public View getView(int position, View convertView, ViewGroup parent) {...}

我唯一能做的就是这个,然后是一对,不是全部,但我的一些元素忽略了它们的布局定位并直接到底部。

View vw_BigRow = convertView;

if (vw_BigRow == null) 
{
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    vw_BigRow = inflater.inflate(R.layout.liftdatalayout, null);
}

vw_BigRow.setMinimumHeight(mHeight);
vw_BigRow.setMinimumWidth(mWidth);
4

1 回答 1

1

1.如果你想call to just one record at a time,只需控制你实现的适配器的getCount返回1。

2.java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams例外是因为要添加到列表视图的视图应该使用AbsListView.LayoutParams而不是其他 LayoutParams,例如RelativeLayout$LayoutParams.

编辑:

请参阅以下getViewgoogle 推荐的代码。

/**
 * Make a view to hold each row.
 *
 * @see android.widget.ListAdapter#getView(int, android.view.View,
 *      android.view.ViewGroup)
 */
public View getView(int position, View convertView, ViewGroup parent) {
    // A ViewHolder keeps references to children views to avoid unneccessary calls
    // to findViewById() on each row.
    ViewHolder holder;

    // When convertView is not null, we can reuse it directly, there is no need
    // to reinflate it. We only inflate a new View when the convertView supplied
    // by ListView is null.
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

        // Creates a ViewHolder and store references to the two children views
        // we want to bind data to.
        holder = new ViewHolder();
        holder.text = (TextView) convertView.findViewById(R.id.text);
        holder.icon = (ImageView) convertView.findViewById(R.id.icon);

        convertView.setTag(holder);
    } else {
        // Get the ViewHolder back to get fast access to the TextView
        // and the ImageView.
        holder = (ViewHolder) convertView.getTag();
    }

    // Bind the data efficiently with the holder.
    holder.text.setText(DATA[position]);
    holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

    return convertView;
}

static class ViewHolder {
    TextView text;
    ImageView icon;
}
于 2012-05-30T01:30:38.377 回答