在GridView中更新视图

时间:2013-09-11 12:48:21

标签: android android-layout android-arrayadapter android-gridview android-adapter

我已经实施了ArrayAdapter来自定义GridView。每个项目的布局都在xml代码中定义,产生类似这样的内容:

layout GridView item

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

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”文本。

3 个答案:

答案 0 :(得分:1)

View AdapterView.OnItemClickListener的{​​{1}}参数是点击的视图。在您的情况下,它将是项目根onItemClick()。在其上调用RelativeLayout或使用ViewHolder模式获取对您要更新的findViewById()的引用,并进行更新。

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

答案 1 :(得分:0)

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

要检查某个项目,我会按如下方式扩展您的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);中致电onItemClickAdapterView实际上会在RelativeLayout内设置项目。

执行此操作后,您可以在扩展gridview.getCheckedItemPosition()上设置背景选择器,这些项目将执行选定,按下,检查等操作。但是,您不需要使用背景选择器。

还有更多内容,您可以随时查看是否使用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"); } }); 查看了视图,如果您想将textview实际设置为“Clicked”,则可能会觉得有用。

holder.extendedrelativeLayout.isChecked()

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

答案 2 :(得分:0)

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