【问题标题】:custom listview doesn't get populated自定义列表视图未填充
【发布时间】:2019-05-30 19:46:02
【问题描述】:

我的布局分为 4 个部分,每个部分都有相同的布局。 4 个相对布局,每个布局有一个图像视图、文本视图和列表视图。可以将布局视为具有自定义布局的 2x2 网格,其中包含一个 imageview、textview 和 listview。列表视图由 2 个文本视图组成。我有一个 ArrayAdapter 与列表视图一起使用。我在传递给适配器的一个数据结构中拥有 listview 的数据。当我运行应用程序时,布局的列表视图区域是空白的,其中显示了 imageview 和 textview。我尝试调试问题,发现适配器的 getView 没有被调用。

布局将如下所示。 application1 和下面的部分是 listview 应该出现的地方。 http://i.imgur.com/9ifIg.png

主布局文件:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<RelativeLayout android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <RelativeLayout android:id="@+id/app1"
        android:layout_width="150dip"
        android:layout_height="250dip"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true">

        <ImageView android:id="@+id/app1Img"
            android:layout_width="175dip"
            android:layout_height="wrap_content"
            android:src="@drawable/icon"
            android:layout_centerHorizontal="true"
            android:layout_below="@id/app1Data"
            android:background="@color/blue"/>

        <TextView android:id="@+id/app1Heading"
            android:layout_width="fill_parent"
            android:layout_height="40dip"
            android:layout_below="@id/app1Img"
            android:paddingLeft="25dip"
            android:background="@color/color2"/>
        <ListView android:id="@+id/app1Data"
            android:layout_width="fill_parent"
            android:layout_height="200dip"
            android:scrollbars="vertical">
        </ListView>

    </RelativeLayout>


    <RelativeLayout android:id="@+id/app2"
        android:layout_width="150dip"
        android:layout_height="250dip"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true">

        <ImageView android:id="@+id/app2Img"
            android:layout_width="175dip"
            android:layout_height="wrap_content"
            android:src="@drawable/icon"
            android:layout_centerHorizontal="true"
            android:background="@color/blue"/>

        <TextView android:id="@+id/app2Heading"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/app2Img"
            android:paddingLeft="25dip"
            android:background="@color/color2"/>

        <ListView android:id="@+id/app2Data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:layout_below="@id/app2Heading"
            android:background="@color/color3">
        </ListView>
    </RelativeLayout>


    <RelativeLayout android:id="@+id/app3"
        android:layout_width="150dip"
        android:layout_height="250dip"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/app1">

        <ImageView android:id="@+id/app3Img"
            android:layout_width="175dip"
            android:layout_height="wrap_content"
            android:src="@drawable/icon"
            android:layout_centerHorizontal="true"
            android:background="@color/blue"/>

        <TextView android:id="@+id/app3Heading"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/app3Img"
            android:paddingLeft="25dip"
            android:background="@color/color2"/>

        <ListView android:id="@+id/app3Data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:layout_below="@id/app3Heading"
            android:background="@color/color3">
        </ListView>
    </RelativeLayout>
    <RelativeLayout android:id="@+id/app4"
        android:layout_width="150dip"
        android:layout_height="250dip"
        android:layout_alignParentRight="true"
        android:layout_below="@id/app2">

        <ImageView android:id="@+id/app4Img"
            android:layout_width="175dip"
            android:layout_height="wrap_content"
            android:src="@drawable/icon"
            android:layout_centerHorizontal="true"
            android:background="@color/blue"/>

        <TextView android:id="@+id/app4Heading"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/app4Img"
            android:paddingLeft="25dip"
            android:background="@color/color2"/>

        <ListView android:id="@+id/app4Data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:layout_below="@id/app4Heading"
            android:background="@color/color3">
        </ListView>
    </RelativeLayout>
</RelativeLayout>
</LinearLayout>

列表视图布局文件:

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

   <TextView android:id="@+id/mainText"
android:layout_width="150dip"
android:layout_height="wrap_content"
/>

<TextView android:id="@+id/subscript"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:lines="2"
android:singleLine="false"/>
</LinearLayout>

主要活动:

TextView app1Header;
ImageView app1Img;
ListView app1Data;


TextView app2Header;
ImageView app2Img;
ListView app2Data;


TextView app3Header;
ImageView app3Img;
ListView app3Data;


TextView app4Header;
ImageView app4Img;
ListView app4Data;

    ApplicationData applicationData = _allApplicationData.get(0);
    app1Header.setText(applicationData.mHeadlineText);
    ArrayList<DashboardListItem> application1ListItems = new ArrayList<DashboardListItem>();
    DashboardListItem application1ListItem1 = new DashboardListItem();
    DashboardListItem application1ListItem2 = new DashboardListItem();
    application1ListItem1.mainText = getApplicationMainTextForRow(0, applicationData.mApplicationName, _organization);
    application1ListItem1.subscript = getApplicationSubscriptForRow(0, applicationData.mApplicationName, _organization);
    application1ListItems.add(application1ListItem1);
    application1ListItem2.mainText = getApplicationMainTextForRow(1, applicationData.mApplicationName, _organization);
    application1ListItem2.subscript = getApplicationSubscriptForRow(1, applicationData.mApplicationName, _organization);
    application1ListItems.add(application1ListItem2);
    DashboardListAdapter application1Adapter = new DashboardListAdapter(getApplicationContext(), R.layout.dashboardlist, application1ListItems);
    app1Data.setAdapter(application1Adapter);

    applicationData = _allApplicationData.get(1);
    app2Header.setText(applicationData.mHeadlineText);
    ArrayList<DashboardListItem> application2ListItems = new ArrayList<DashboardListItem>();
    DashboardListItem application2ListItem = new DashboardListItem();
    application2ListItem.mainText = getApplicationMainTextForRow(0, applicationData.mApplicationName, _organization);
    application2ListItem.subscript = getApplicationSubscriptForRow(0, applicationData.mApplicationName, _organization);
    application2ListItems.add(application2ListItem);
    DashboardListAdapter application2Adapter = new DashboardListAdapter(getApplicationContext(), R.layout.dashboardlist, application2ListItems);
    app2Data.setAdapter(application2Adapter);

    applicationData = _allApplicationData.get(2);
    app3Header.setText(applicationData.mHeadlineText);
    ArrayList<DashboardListItem> application3ListItems = new ArrayList<DashboardListItem>();
    DashboardListItem application3ListItem = new DashboardListItem();
    application3ListItem.mainText = getApplicationMainTextForRow(0, applicationData.mApplicationName, _organization);
    application3ListItem.subscript = getApplicationSubscriptForRow(0, applicationData.mApplicationName, _organization);
    application3ListItems.add(application3ListItem);
    DashboardListAdapter application3Adapter = new DashboardListAdapter(getApplicationContext(), R.layout.dashboardlist, application3ListItems);
    app3Data.setAdapter(application3Adapter);

    applicationData = _allApplicationData.get(3);
    app4Header.setText(applicationData.mHeadlineText);
    ArrayList<DashboardListItem> application4ListItems = new ArrayList<DashboardListItem>();
    DashboardListItem application4ListItem = new DashboardListItem();
    application4ListItem.mainText = getApplicationMainTextForRow(0, applicationData.mApplicationName, _organization);
    application4ListItem.subscript = getApplicationSubscriptForRow(0, applicationData.mApplicationName, _organization);
    application4ListItems.add(application4ListItem);
    DashboardListAdapter application4Adapter = new DashboardListAdapter(getApplicationContext(), R.layout.dashboardlist, application4ListItems);
    app4Data.setAdapter(application4Adapter);

适配器文件:

public class DashboardListAdapter extends ArrayAdapter<DashboardListItem>{

private Context mContext;
private ArrayList<DashboardListItem> dashBoardData;
int resource;

public DashboardListAdapter(Context context, int textViewResourceId,
        ArrayList<DashboardListItem> objects) {
    super(context, textViewResourceId, objects);
    // TODO Auto-generated constructor stub
    mContext = context;
    resource = textViewResourceId;
    dashBoardData = objects;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public DashboardListItem getItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View v = convertView;
    if(convertView == null){
        convertView = new LinearLayout(getContext());
        String inflater = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater vi;
        vi = (LayoutInflater) getContext().getSystemService(inflater);
        v = vi.inflate(resource,null);
    } 
    //DashboardListItem appData = dashBoardData.get(position);
    DashboardListItem listItem = dashBoardData.get(position);
    TextView mainText = (TextView) v.findViewById(R.id.mainText);
    TextView subscript = (TextView)v.findViewById(R.id.subscript);

    mainText.setText(listItem.mainText);
    subscript.setText(listItem.subscript);
    return convertView;
}

}

我在编译或运行应用程序时没有收到任何错误。只是 getView() 没有被调用。要传递给适配器的数据数组列表是手动填充和传递的,以确保数据确实被填充。我从日志中检查了数据不为空/空。

我非常坚持这一点。我试图搜索很多,但我仍然无法找到为什么 getView() 没有被调用。

【问题讨论】:

    标签: android


    【解决方案1】:

    我找到了问题的解决方案。这是我的错误。在适配器 getview 中,我犯了 2 个错误。一个是使用我传递给构造函数的资源来膨胀视图,而不是使用 R 直接引用布局。第二个是我在返回转换视图时将它膨胀到视图 v。无论如何感谢您的时间和帮助。

    【讨论】:

      【解决方案2】:

      在要显示数据的位置使用.setDatasetChanged() 来告诉列表视图进行填充。

      我认为你应该从传递给构造函数的 List 中设置文本 dashBoardData.get(position)。

      您在哪里从 xml 实例化列表视图?我在你的代码中没有看到它

      您必须这样做才能填充列表(这适用于您的所有列表视图)

      ListView app1Data = (ListView)findViewById(R.id.app1Data);  // <--- This is what might be causing your issue.
      

      【讨论】:

      • 感谢尼古拉的回复。我确实有代码在 MainActivity 的 onCreate() 中从 xml 实例化 listview。我正在设置我传递给构造函数的丢失文本。这是在 getView() 中完成的。 DashboardListItem listItem = dashBoardData.get(position); mainText.setText(listItem.mainText); subscript.setText(listItem.subscript);在向适配器添加数据后,我在 mainactivity 中添加了 adapter.notifyDataSetChanged() 。仍然没有填充列表视图。
      • 我找到了问题的解决方案。这是我的错误。在适配器 getview 中,我犯了 2 个错误。一个是使用我传递给构造函数的资源来膨胀视图,而不是使用 R 直接引用布局。第二个是我在返回转换视图时将它膨胀到视图 v。无论如何,感谢您的时间和帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多