【问题标题】:ListView children problemsListView 子问题
【发布时间】:2014-03-31 20:11:49
【问题描述】:

我的程序和列表视图有问题。 我有一个简单的列表视图,上面有 2 个项目

乔博客


大卫·琼斯

我正在尝试将第一个元素的背景颜色设置为绿色,但是在使用时我不断收到空指针异常

namesList.getChildAt(0).setBackgroundColor(Color.GREEN);

还有

 namesList.getChildCount(); 

即使列表中有 2 项,也始终返回 0。

我真的不明白为什么这不起作用,我是否缺少某些步骤。

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class LecturerLogsView extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lecturer_logs_view);
        ListView namesList = (ListView)findViewById(R.id.namesList);
        String names[]={"Joe Bloggs", "David Jones"};

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1,
                names);
        namesList.setAdapter(adapter);

        namesList.getChildAt(0).setBackgroundColor(Color.GREEN);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.lecturer_logs_view, menu);
        return true;
    }

}

xml文件

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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=".LecturerLogsView" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <ListView
        android:id="@+id/namesList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1" >
    </ListView>

</RelativeLayout>

【问题讨论】:

  • setAdapter 是 asynchronous ... getChildCount() 等。最终会得到正确的值。改变颜色的地方在适配器内部:)
  • @rupps 你是这个意思吗? ArrayAdapter 适配器 = new ArrayAdapter(this, android.R.layout.simple_list_item_1, names); namesList.getChildAt(0).setBackgroundColor(Color.GREEN); namesList.setAdapter(适配器); ,不幸的是,这仍然不适合我

标签: android listview children


【解决方案1】:

setAdapter 是一个异步调用。在你调用它之后,它需要一些时间来执行,这就是为什么在分配它之后你会得到与“无数据”状态一致的值。

您需要修改您的适配器 getView ,即ListView 每次需要视图时调用的函数。您需要阅读它,这是了解 Android 小部件如何真正工作的关键。

在你的例子中,这会做到:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, listItems) {
       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
              View view=super.getView(position, convertView, parent); // we get the original view
              if (position==0) view.setBackgroundColor(Color.GREEN);  // and change color if position==0
              return view;
       }
 };

...但我再次建议您仔细阅读这些东西的工作原理,找到关于适配器的好教程!

【讨论】:

  • 谢谢你我现在明白了
【解决方案2】:

这是我会尝试的:

public class LecturerLogsView extends Activity {
    ArrayList<String> listItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);            
        listItems = new ArrayList<String>();
        listItems.add("Joe Bloggs \n");
        listItems.add("David Jones \n");
        setContentView(R.layout.activity_lecturer_logs_view);
        (ListView) getView().findViewById(R.id.namesList)

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                getActivity(), android.R.layout.simple_list_item_1,
                listItems);
        namesList.setAdapter(adapter);

        namesList.getChildAt(0).setBackgroundColor(Color.GREEN);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.lecturer_logs_view, menu);
        return true;
    }

}

记得导入 ArrayList。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多