ListView 元素不显示

ListView Elements Not Displaying

ListView 元素没有显示,即使我以前使用过几乎相同的代码。抱歉,我不得不问这类问题,但我真的不明白为什么它不起作用。 None 我看过的其他类似问题很有用。

项目和 ListView 的高度应该没问题。不确定发生了什么。谢谢大家。

这是代码转储:

主要活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_select_city);
    findViewById(R.id.loadingPanel).setVisibility(View.GONE); // remove loading animation

    ArrayList<String> citiesList = new ArrayList<>();
    citiesList.add("Waterloo");
    citiesList.add("Guelph");
    populateCities(citiesList);
}

public void populateCities(ArrayList<String> citiesList) {

    // see what the list is
    Toast.makeText(getApplicationContext(),citiesList.toString(),Toast.LENGTH_LONG).show();

    // populate the ListView
    CitiesListAdapter citiesListAdapter = new CitiesListAdapter(this, citiesList);
    ListView citiesListView = (ListView)findViewById(R.id.cities_list);
    citiesListView.setAdapter(citiesListAdapter);

    // listen for when a city in the list is clicked
    citiesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // go to the bar list activity (send the city and province with it)
            TextView lblCity = (TextView)view.findViewById(R.id.lblCity);
            String city = lblCity.getText().toString();
            Toast.makeText(getApplicationContext(), city, Toast.LENGTH_LONG).show();
        }
    });
}

这是列表适配器代码 (CitiesListAdapter):

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;

public class CitiesListAdapter extends ArrayAdapter<String> {

    private final Activity context;
    private final ArrayList<String> cities;

    public CitiesListAdapter(Activity context, ArrayList<String> cities) {
        super(context, R.layout.cityitem);
        this.context = context;
        this.cities = cities;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.cityitem, null, true);

        TextView lblCity = (TextView)rowView.findViewById(R.id.lblCity);
        lblCity.setText(this.cities.get(position));

        return rowView;
    }
}

然后是主要布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.myapp.SelectCity">

    <RelativeLayout
        android:id="@+id/loadingPanel"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center" >

        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:indeterminate="true"
            android:id="@+id/progressBar" />
    </RelativeLayout>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnBack"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="5dp"
        android:onClick="back"
        android:src="@mipmap/ic_menu_back"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnRefresh"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="5dp"
        android:onClick="refresh"
        android:src="@mipmap/ic_action_refresh"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Select City"
        android:id="@+id/lblTitle"
        android:layout_below="@+id/btnBack"
        android:layout_centerHorizontal="true" />


    <RelativeLayout
        android:id="@+id/listViewLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/lblTitle"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="20dp"
        android:layout_marginTop="20dp">

        <ListView
            android:background="#F00"
            android:id="@+id/cities_list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_alignParentBottom="true"
            android:layout_alignParentTop="true" />

    </RelativeLayout>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:layout_below="@+id/listViewLayout"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

然后是ListView项目布局(cityitem.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="City"
        android:id="@+id/lblCity" />
</LinearLayout>

编辑:看起来我也遇到了 Android 似乎无法修复的愚蠢错误(只是在 LogCat 中偷偷摸摸):

E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab7ccc40

不确定这是否是未显示任何内容的原因。

截图:http://prntscr.com/avpy9s

你的构造函数中的 super 调用不包括 ArrayList,你也没有将 getCount() 覆盖到 return 列表大小,所以你的 Adapter 是 returning 0 的项目计数,并且 ListView 不会尝试检索任何 Views。您可以在 super 调用中包含 ArrayList,或将 getCount() 方法重写为 return cities.size().

但是,对于 String 的简单 ArrayList,您不一定需要自定义 Adapter。您可以简单地使用 ArrayAdapter 的构造函数,它采用布局和 TextView 资源 ID。

ArrayAdapter<String> citiesListAdapter = new ArrayAdapter<>(this,
                                                            R.layout.cityitem,
                                                            R.id.lblCity,
                                                            cities);

ListView 中没有布局。您需要在 ListView 中添加布局(线性或相对)。像这样!

<ListView 
<RelativeLayout />
/>

在布局中,您声明要显示的内容 - TextView 或 ImageView 等。