ListView.getChildAt(validPosition)返回null

时间:2013-04-06 11:11:33

标签: android

当用户点击ListView的项目时,我会在此列表项目中显示“编辑”按钮。 lastSelectedPosition具有最后点击的列表项的位置。

代码:

public class MainActivity extends Activity {
    private ListView listView;
    private MyAdapter adapter;

    // static - If the activity is re-created, the data
    // about list items remain.
    private static List<String> items = loadItems();

    private MyItemClickListener listener = new MyItemClickListener();
    private int lastSelectedPosition = ListView.INVALID_POSITION;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        listView = (ListView) findViewById(R.id.myListView);
        adapter = new MyAdapter(R.layout.my_item, items);
        listView.setAdapter(adapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        listView.setOnItemClickListener(listener);

        if (savedInstanceState != null) {
            // Is recreating the activity because 
            // of the change screen orientation. 

            lastSelectedPosition = savedInstanceState.getInt("lastSelectedPos");
            if (lastSelectedPosition != ListView.INVALID_POSITION) {
                // !!! getChildAt() always returns null !!!
                View listItem = listView.getChildAt(lastSelectedPosition);
                View editButton = listItem.findViewById(R.id.editButton);

                // Only selected list item has visible EditButton, 
                // other list items have not
                editButton.setVisibility(View.VISIBLE);
            }
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // Is destroying the activity because 
        // of the change screen orientation.

        outState.putInt("lastSelectedPos", lastSelectedPosition);               
    }

    // Other methods
}

我认为getChildAt()始终会在null中返回Activity.onCreate(),因为此时列表尚未完全开发。如何让View列表项显示“编辑”按钮?

抱歉我的英语。

由于

2 个答案:

答案 0 :(得分:1)

您的适配器需要知道此选定位置,以便在getView()中正确呈现。只需修改适配器的构造函数以获取int,并在调用onclick时更新该int值。通常,您应该始终拥有在适配器中重新创建列表项状态所需的所有信息。

答案 1 :(得分:0)

我认为这是因为当用户点击列表视图中的项目时,您没有更改lastSelectedPosition的值。只需像以下代码段一样实施您的onItemClickListener即可。并在此更改lastSelectedPosition的值。并删除你的

private MyItemClickListener listener = new MyItemClickListener(); 

线。 在您定义lastSelectedPosition变量之前,我认为listener的值无法更改。而且我也不知道你在哪里定义listener变量。

lv1.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
lastSelectedPosition = arg2
}
});

我希望这会对你有所帮助。