【问题标题】:ListView.getChildAt(validPosition) returns nullListView.getChildAt(validPosition) 返回 null
【发布时间】:2013-04-06 11:11:33
【问题描述】:

当用户单击 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() 总是在Activity.onCreate() 中返回null,因为那个时候列表还没有完全发展。如何获取列表项的View 以在其上显示编辑按钮?

对不起我的英语。

谢谢

【问题讨论】:

标签: android


【解决方案1】:

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

【讨论】:

  • dmon,现在我在MyAdapter 中设置了编辑按钮的可见性,并且实际上将显示按钮。但是如果我在用户单击其他列表项时调用listView.getChildAt(lastSelectedPosition).findViewById(R.id.editButton).setVisibility(View.INVISIBLE),则按钮不会在视觉上消失,但listView.getChildAt(lastSelectedPosition).findViewById(R.id.editButton).getVisibility() 返回View.INVISIBLE。怎么了? Android 中的错误?
  • 我不认为 listView.getChildAt(position) 是你想要的东西。列表视图应该只根据需要生成尽可能多的视图。如果您有一个包含数千个项目的列表,listView.getChildAt(500) 肯定会返回 null。你在哪里试图使按钮不可见?顺便说一句,INVISIBLE 使按钮不可见,但仍会在布局中占用空间。 GONE 将删除它。
  • 现在我将更改主要信息
  • 您不应该这样做,如果原始问题得到了回答,请创建一个新问题。否则讨论会变得混乱。
【解决方案2】:

我认为这是因为当用户单击列表视图中的项目时,您没有更改 lastSelectedPosition 的值。只需实现您的onItemClickListener,如下面的代码 sn-p。并在此更改您的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
}
});

希望对你有帮助。

【讨论】:

  • 没有。为简单起见,我没有显示完整的代码。这里显示的代码是我真实代码的近似方案。事实上,我在 onItemClickListener() 中更改了 lastSelectedPosition 的值。我在 onCreate() 中使用日志检查了变量的值 - 更改屏幕方向后变量具有实际值。唯一的问题是方法 getChildAt() - 该方法返回 null。也许 ListView 中有类似 ListView.setOnListFullyDevelopedListener(OnListFullyDevelopedListener listener) 的方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2020-06-19
  • 2011-10-15
相关资源
最近更新 更多