【问题标题】:Error in Custom Adapter ListView in getView() MethodgetView() 方法中的自定义适配器 ListView 错误
【发布时间】:2015-10-29 19:19:30
【问题描述】:

我在我的应用程序中遇到了一个非常奇怪的行为。
问题是我的活动中有一个导航抽屉,但我需要在导航抽屉中显示不同的 ListView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="top">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent" android:layout_height="@dimen/nav_header_height"
        android:background="@drawable/side_nav_bar"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:theme="@style/ThemeOverlay.AppCompat.Dark" android:orientation="vertical"
        android:gravity="bottom">
        <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:src="@drawable/ic_logo" android:id="@+id/imageView" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/lb_dashboard_menu"
            android:id="@+id/textView"
            android:textColor="@color/colorPrimaryDark" />
    </LinearLayout>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/menu_gateways"
        android:textColor="@color/text_color"
        android:gravity="center_vertical"
        android:paddingLeft="16dp"
        android:background="@color/background_clear" />
    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/lv_menu_gateway"
        android:minHeight="90dp"
        android:background="@color/background_accent" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/menu_options"
        android:textColor="@color/text_color"
        android:gravity="center_vertical"
        android:paddingLeft="16dp"
        android:background="@color/background_clear"
        android:paddingRight="16dp" />
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/lv_menu_options"
        android:background="@color/background_accent" />
</LinearLayout>

正如您在上面的代码中看到的,问题是当我为第一个 ListView 加载适配器时,我试图对其进行调试,而 getView() 方法在没有明显原因的情况下无限期地重复。

在第二个 ListView 中,我确定我传递了一个包含 5 个项目的列表,但在调试时我发现位置始终为 0。
这就是为什么我只获得 Activity 中列表的第一项。

public class ListGatewayAdapter extends BaseAdapter {

    protected List<Device> devices;
    private static LayoutInflater inflater;
    AppManager manager;

    public ListGatewayAdapter(Activity activity, List<Device> devices){
        this.devices = devices;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        manager = AppManager.getManager(activity.getApplication());
    }

    @Override
    public int getCount() {
        return devices.size();
    }

    @Override
    public Device getItem(int position) {
        return devices.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if(convertView == null)
            view = inflater.inflate(R.layout.gateway_cell, parent, false);
        TextView name = (TextView)view.findViewById(R.id.lb_gateway_name);
        TextView number = (TextView)view.findViewById(R.id.lb_gateway_number);
        ImageView status = (ImageView)view.findViewById(R.id.im_gateway_active);
        Device device = getItem(position);
        name.setText(device.getDeviceName());
        number.setText(device.getDeviceNumber());
        String lastDeviceConnected = manager.RetrieveSharedLastDeviceConnect();
        if(lastDeviceConnected != null){
            if(lastDeviceConnected.equals(device.getDeviceNumber()) ) {
                status.setColorFilter(Color.argb(0, 0, 0, 255));
            }else{
                status.setColorFilter(Color.argb(0, 0, 0, 0));
            }
        }
        return view;
    }
}

上面是第一个适配器的代码,第二个和这个非常相似。

我希望有人能帮助我找到解决这个问题的方法。

更新我在监视器中注意到我得到了这个:

10-29 15:23:07.330 8785-8785/com.realstatediary.jperera.rapidsentrymaster W/View: requestLayout() improperly called by android.widget.ListView{11445886 VFED.VC. .F....ID 0,540-888,810 #7f0c007c app:id/lv_menu_gateway} during layout: running second layout pass
10-29 15:23:07.370 8785-8785/com.realstatediary.jperera.rapidsentrymaster W/View: requestLayout() improperly called by android.widget.ListView{11445886 VFED.VC. ........ 0,540-888,810 #7f0c007c app:id/lv_menu_gateway} during second layout pass: posting in next frame

【问题讨论】:

  • 设置列表视图的固定高度,例如 200dp 并再次测试
  • 您可能需要添加一个viewholder以避免频繁调用findViewById方法。此外我想看看你如何初始化列表和相关的适配器
  • 完美,谢谢@Leon_SFS 这解决了第二个 ListView 的问题,但是我在 Android Monitor 中发现的问题呢?
  • 谢谢@Sindico 我正在手动加载列表
  • 您何时在控制台中收到该错误?当您放大某些视图时?

标签: android listview android-listview


【解决方案1】:

尝试将第一个 ListView 的布局宽度和高度更改为“match_parent”。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多