Android:在自定义ListView中设置单个按钮的可见性

3
我有一个ListView,使用自定义适配器(扩展BaseAdapter),每行的布局由TextView和Button组成。创建列表后,我想更改特定按钮的可见性。
为此,我需要以编程方式访问单个行的View。我无法找到如何做到这一点。此答案提到了getView(int position),但我找不到该方法;getView()需要3个参数。我应该将什么作为convertView传递给getView(int position, View convertView, ViewGroup parent)
请指导我正确的方向。
更新:通过View v = myListView.getChildAt(myListView.getFirstVisiblePosition());获得的View为空。myListView.getChildCount()也返回0。
2个回答

1

谢谢,但是很遗憾,ListView行的点击不会发生。 - Chaitanya

0

这里有一个示例,是我在列表视图中使用的自定义适配器,用户可以选择 listView 中的项目并将其标记为删除。关键是在获得视图后添加 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?我也有Button的onClickListeners;但我需要根据时间使按钮可见-不会有任何点击。 - Chaitanya
ListView 为了高效运行而回收视图。因此,如果该视图已经被填充,则会得到一个非空行。可能需要使用 Adapter.notifyDatSetChanged() 强制 ListView 更新视图。然后,列表视图将为每个可见的行调用 getView()。 - Plastic Sturgeon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接