android - ArrayAdapter 只显示一条记录

标签 android

我之前曾用其他适配器(如 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 上,但是我仍然没有正确地进行分配,因为我继续收到错误。我在 Activity 中尝试使用以下设置高度/宽度:

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 是一个有效的引用而不是 null。

在 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);

最佳答案

1.如果您希望一次只调用一条记录,只需控制您实现的适配器的 getCount 返回 1。

2.java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams 异常是因为要添加到listview的 View 应该使用AbsListView.LayoutParams而不是其他 LayoutParams,例如 RelativeLayout$LayoutParams

编辑:

看下面的getView代码,是google推荐的。

/**
 * 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;
}

关于android - ArrayAdapter 只显示一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808003/

相关文章:

android - 除了 Display.getOrientation() 已弃用之外,Display.getRotation() 和 Display.getOrientation() 之间有什么区别?

android - 重置或刷新数据库连接

android - 在绘图中使用 "dp"和 "sp"

java - 子线程与父线程通信

java - gradle:编译android junit测试apk文件

c# - 如何通过 Xamarin.Android 中的单个 Activity 通过单击按钮在 View 之间导航?

Android Bitmap/Drawable mask

java - GoogleMap 未显示

java - 安卓。键盘永远不会出现

Android - Android 6.0 - 申请流程 - 服务流程