空白列表活动,ListView对象不为空

时间:2016-11-19 14:45:52

标签: android listview layout

我的ListedActivity为空,不会抛出任何错误或异常。它只是坐在那里,什么都不做。

我的数据库不应为空,有一些条目。

public class ListedActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        LayoutInflater inflater = (LayoutInflater)   getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        LinearLayout mContainer = (LinearLayout) inflater.inflate(R.layout.activity_list, null);
        ListView listView = (ListView) mContainer.findViewById(R.id.listedactivity_list_view);
        DBHelper dbHelper = new DBHelper(getApplicationContext());
        ArrayList<MyLayoutObject> b = dbHelper.getAllResults();

        MyAdapter a = new MyAdapter(this, b);

        listView.setAdapter(a);

        listView.setOnItemClickListener(
            new AdapterView.OnItemClickListener(){
                @Override
                public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {
                    Intent intent = new Intent(ListedActivity.this, ResultsActivity.class);
                    intent.putExtra("position", position);
                    intent.putExtra("id", id);
                    startActivity(intent);
                }
            }
        );
    }
}

活动列表应该写出我数据库的所有结果。这是它的.xml。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="smart.tuke.sk.makac.ListedActivity">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#eeeeee"
        android:id="@+id/listedactivity_list_view" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@android:id/empty"
        android:text="@string/no_data"
        android:visibility="gone" />
</LinearLayout>

这是我的行布局。每一行都应该是这样的。它的.xml在下面。

<?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="match_parent"
    >

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="61dp"
        android:orientation="vertical">

    <TextView
        android:id="@+id/date_recorded"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textSize="18sp"
        android:textStyle="bold"
        android:textColor="#111111" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/duration_recorded" />

        <TextView
            android:layout_width="345dp"
            android:layout_height="wrap_content"
            android:id="@+id/distance_recorded" />

        <TextView
            android:layout_width="345dp"
            android:layout_height="wrap_content"
            android:id="@+id/pace_recorded" />

        <TextView
            android:layout_width="345dp"
            android:layout_height="wrap_content"
            android:id="@+id/calories_recorded" />
    </LinearLayout>

</LinearLayout>

MyLayoutObject是带有getter的5个字符串,仅此而已

帮助我,Overflow Kenobi,你是我唯一的希望!

编辑:适配器代码

class MyAdapter extends BaseAdapter{

    private LayoutInflater inflater;
    private ArrayList<MyLayoutObject> objects;

    private class ViewHolder {
        TextView date;
        TextView duration;
        TextView distance;
        TextView pace;
        TextView calories;
    }

    MyAdapter(Context context, ArrayList<MyLayoutObject> objects) {
        inflater = LayoutInflater.from(context);
        this.objects = objects;
    }

    public int getCount() {
        return objects.size();
    }

    public MyLayoutObject getItem(int position) {
        return objects.get(position);
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.row_layout, null);
            holder.date = (TextView) convertView.findViewById(R.id.date_recorded);
            holder.distance = (TextView) convertView.findViewById(R.id.distance_recorded);
            holder.duration = (TextView) convertView.findViewById(R.id.duration_recorded);
            holder.pace = (TextView) convertView.findViewById(R.id.pace_recorded);
            holder.calories = (TextView) convertView.findViewById(R.id.calories_recorded);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.date.setText(objects.get(position).getDate());
        holder.duration.setText(objects.get(position).getDuration());
        holder.distance.setText(objects.get(position).getDistance());
        holder.pace.setText(objects.get(position).getPace());
        holder.calories.setText(objects.get(position).getCalories());
        return convertView;
    }
}

和适配器的.xml

<?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="match_parent"
    >

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="61dp"
        android:orientation="vertical">

    <TextView
        android:id="@+id/date_recorded"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textSize="18sp"
        android:textStyle="bold"
        android:textColor="#111111" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/duration_recorded" />

        <TextView
            android:layout_width="345dp"
            android:layout_height="wrap_content"
            android:id="@+id/distance_recorded" />

        <TextView
            android:layout_width="345dp"
            android:layout_height="wrap_content"
            android:id="@+id/pace_recorded" />

        <TextView
            android:layout_width="345dp"
            android:layout_height="wrap_content"
            android:id="@+id/calories_recorded" />
    </LinearLayout>

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您正试图在充气的自定义视图中“找到”android.R视图。您正在膨胀的布局不包含此视图(此类视图仅显示在预定义的布局中,例如android.R.layout.simple_list_item

另外,请考虑活动的XML中的这一行:android:id="@android:id/list"

您实际上并没有为元素分配ID。这样做:android:id="@+id/listedactivity_list_view"(重要的是@ + id)。

现在,在您的活动中,请执行以下操作:ListView listView = (ListView) mContainer.findViewById(R.id.listedactivity_list_view);

通过这样做,您实际上是引用视图中的实际元素,而不是引用布局中不存在的某些“ghost元素”。

编辑:在仔细阅读您的代码后,我终于找到了问题......看看以下几行:

setContentView(R.layout.activity_list);

LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout mContainer = (LinearLayout) inflater.inflate(R.layout.activity_list, null);
ListView listView = (ListView) mContainer.findViewById(R.id.listedactivity_list_view);

在第1行(代码段)中,您将内容视图设置为特定的布局资源。但是,在第3行(mContainer)中,你将这个布局再次膨胀 - 所以当你在第4行中执行findViewById时,你实际上在膨胀的视图中寻找的东西比实际显示的视图更重要。因此,您的问题的解决方案是删除inflater和mContainer变量:

setContentView(R.layout.activity_list);

ListView listView = (ListView) findViewById(R.id.listedactivity_list_view);