【问题标题】:Android : set visibility of individual buttons in a custom ListViewAndroid:在自定义 ListView 中设置单个按钮的可见性
【发布时间】:2011-11-22 18:10:26
【问题描述】:

我有一个带有自定义适配器(扩展 BaseAdapter)的 ListView,每行的布局由一个 TextView 和一个 Button 组成。创建列表后,我想更改特定按钮的可见性。

为此,我需要以编程方式访问单个行的视图。我不知道该怎么做。 This answer 提到 getView(int position),但我找不到那个方法; getView() 需要 3 个参数。我应该将convertView 传递给getView(int position, View convertView, ViewGroup parent) 什么?

你能指出我正确的方向吗?

更新:View v = myListView.getChildAt(myListView.getFirstVisiblePosition()); 获得的视图为空。此外,myListView.getChildCount() 返回 0。

【问题讨论】:

    标签: android android-layout android-listview android-ui


    【解决方案1】:

    onItemClick 会将被单击的 ListView 中的视图传递给您。然后你可以抓住那个 View 并用它做任何你想做的事情,包括改变可见性等。

    http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html

    【讨论】:

    • 谢谢,但很遗憾,不会发生单击 ListView 行的情况。
    【解决方案2】:

    这是我在列表视图中使用的自定义适配器的示例 I,其中用户可以选择列表视图中的项目并将它们标记为删除。关键是在有视图之后添加 onClickListener。然后,您不仅可以使用它来更改视图,还可以更新适配器的数据。 希望您可以修改此代码以适合您的具体情况。

    private class DeletePlayerAdapter extends ArrayAdapter<Player> {
        Context context;
        int layoutResourceId;
        ArrayList<Player> data;
    
        public DeletePlayerAdapter(Context context, int layout,
                ArrayList<Player> list) {
            super(context, layout, list);
            this.layoutResourceId = layout;
            this.context = context;
            this.data = list;
        }
    
        @Override
        public View getView(final int position, View convertView,
                ViewGroup parent) {
            View row = convertView;
            PlayerHolder holder = null;
            if (row == null) {
                LayoutInflater inflater = ((Activity) context)
                        .getLayoutInflater();
                row = inflater.inflate(layoutResourceId, parent, false);
                holder = new PlayerHolder();
                holder.player_name = (TextView) row
                        .findViewById(R.id.player_name);
                holder.player_number = (TextView) row
                        .findViewById(R.id.player_number);
                holder.seeded_button = (ImageButton) row
                        .findViewById(R.id.delete_toggle);
                holder.player_name.setTypeface(tf);
                holder.player_number.setTypeface(tf);
                row.setTag(holder);
                players_array.get(position).marked_for_delete = false;
    
            } else {
                Log.d("PLAYER_ADAPTER", "NOT_NULL ROW");
                holder = (PlayerHolder) row.getTag();
            }
            holder.seeded_button.setOnClickListener(new OnClickListener() {
                private int pos = position;
    
                public void onClick(View v) {
                    ImageButton b = (ImageButton) v;
                    if (b.isSelected()) {
                        b.setSelected(false);
                        players_array.get(pos).marked_for_delete = false;
                    } else {
                        b.setSelected(true);
                        players_array.get(pos).marked_for_delete = true;
                    }
                }
            });
            Player p = data.get(position);
            holder.player_name.setText(p.name);
            holder.player_number.setText(String.valueOf(position+1));
            holder.seeded_button
                    .setSelected(players_array.get(position).marked_for_delete);
            return row;
        }
    
    }
    
    static class PlayerHolder {
        TextView player_number;
        TextView player_name;
        ImageButton seeded_button;
    }
    

    【讨论】:

    • 谢谢。如何为非空行调用 getView?我也有用于按钮的 onClickListeners;但我需要根据时间使按钮可见 - 不会有任何点击。
    • ListView 回收视图以便高效工作。因此,如果该视图已经膨胀,您将获得一个非空行。您可能需要使用 Adapter.notifyDatSetChanged() 来强制 ListView 更新视图。然后列表视图将为每个可见行调用 getView()。
    猜你喜欢
    • 2013-04-24
    • 2013-11-30
    • 2011-09-02
    • 2013-06-07
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多