0

我已经实现了一个ArrayAdapter用于定制一个GridView. 每个项目的布局在 xml 代码中定义,生成如下所示:

布局 GridView 项

在我的活动中,我实现了以下代码:

GridView gridview = (GridView) findViewById(R.id.gridview);
        adapter = new myArrayAdapter(this, articlesList);
        gridview.setAdapter(new myArrayAdapter(this, articlesList));     
        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                // here I want to change the text of the `TextView` in the right bottom corner to "CLICKED"
            }
        });

正如代码的注释部分所述,我只是想更新右下角的 TextView,在其中写入文本“CLICKED”。

4

3 回答 3

1

View参数 toAdapterView.OnItemClickListener onItemClick()是被点击的视图。在您的情况下,它将是项目 root RelativeLayout。调用findViewById()它或使用 ViewHolder 模式来获取对TextView要更新的引用并更新它。

另请注意,当视图被回收时,即getView()使用非 null 调用适配器时convertView,您需要将其重置TextView为其默认状态。

于 2013-09-11T12:54:12.620 回答
0

如果您只想向用户提供他们已检查项目的反馈,则您可能不需要将 TextView 设置为“已单击”。另一种方法可能是执行以下操作。请注意,如果您仍然需要,此方法还将帮助您将文本视图设置为“单击”。

要检查一个项目,我会将您的扩展RelativeLayout如下:

public class CheckableRelativeLayout extends RelativeLayout implements Checkable {
    private boolean mChecked;

    private static final int[] CHECKED_STATE_SET = {
        android.R.attr.state_checked
    };

    public CheckableRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }

    public void toggle() {
        setChecked(!mChecked);
    }

    public boolean isChecked() {
        return mChecked;
    }

    public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            refreshDrawableState();
        }
    }
}

然后你可以调用parent.setItemChecked(position,true);in onItemClickwhich 实际上将项目设置为在AdapterView.

然后,这样做将允许您在扩展上设置背景选择器,RelativeLayout并且项目将执行选择、按下、选中等操作。但是,您不需要使用背景选择器。

还有更多,您可以随时查看是否检查了视图,gridview.getCheckedItemPosition()如果您想实际将 textview 设置为“Clicked”,您可能会发现它很有用。

gridview.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

        parent.setItemChecked(position,true);
        yourAdapter.ViewHolder vh = (yourAdapter.ViewHolder) v.getTag();
        vh.textView.setText("Clicked");
    }
});

在您的适配器中,您可以在静态 ViewHolder 类中保存对扩展相对布局的引用,如果选中(例如holder.extendedrelativeLayout.isChecked()),请确保将 textView 设置为“Clicked”。

于 2013-09-11T13:26:19.950 回答
0

尝试gridView.invalidateViews();它自动调用适配器的 getView() 方法并更新视图。

于 2015-12-17T11:52:52.063 回答