我有GridView
带有一堆图标,我需要选择一个。选择我的意思是:
我发现了这个:
http://groups.google.com/group/android-developers/browse_thread/thread/f08a58167dbaa8c8
所以我猜setSelection
不在图片中,我不能用它来选择图标本身,也不能画出视觉提示。我知道onItemClickListener
中的网格项位置,我可以将其保存为私有类变量。我最大的问题是绘制视觉提示。
我怎样才能实现这一目标?如何在点击的项目上绘制视觉提示,如果用户点击不同的项目,则“展开”该视觉提示并在新项目中重新绘制它?
答案 0 :(得分:4)
经过几个小时的处理后,我想我终于找到了我想要的解决方案。尽管答案几乎没有关联,但Ian解决方案的初始编辑帮助我找到了这个解决方案:)
我不会解释我所做的一切,我认为这是非常自我解释的。只是几点评论:
首先,我尝试了view.Invalidate()
和view.postInvalidate()
而不是iconAdapter.notifyDataSetChanged()
,但都没有效果。文件指出,无效方法只是“要求”在可能的情况下重新绘制视图。
我一直在寻找一种比合并两个drawable更简单的解决方案。例如,在ImageView
背景上绘制图标,将视觉提示绘制为图像。出于某种奇怪的原因,当GridView
滚动时,视觉提示开始随机显示其他所有图标。我不明白为什么,但在背景图像上的视觉提示的想法对我来说非常有意义,而ImageView
允许这样做,不需要额外的合并方法。但是,如果没有它我就无法工作......
<强> MyActivity.java 强>
public class MyActivity extends Activity {
private GridView mGridViewIcon;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mGridViewIcon = (GridView)findViewById(R.id.gridview_icon);
mGridViewIcon.setAdapter(new IconAdapter(this));
mGridViewIcon.setOnItemClickListener(new GridView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
IconAdapter iconAdapter = (IconAdapter)parent.getAdapter();
iconAdapter.setSelectedItemPosition(position);
iconAdapter.notifyDataSetChanged();
}
});
}
}
<强> IconAdapter.java 强>
public class IconAdapter extends BaseAdapter {
private int mSelectedPosition;
private Integer[] mThumbIds;
private int mIconSize;
private Context mContext;
public IconAdapter(Context context) {
mThumbIds = AppHelper.ICON_SET.keySet().iterator().next();
mIconSize = context.getResources().getDimensionPixelSize(R.dimen.default_icon_size);
mContext = context;
}
@Override
public int getCount() {
return mThumbIds.length;
}
@Override
public Object getItem(int position) {
return mContext.getResources().getDrawable(mThumbIds[position]);
}
@Override
public long getItemId(int position) {
return mThumbIds[position];
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if(convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
} else {
imageView = (ImageView)convertView;
}
if(mSelectedPosition == position) {
imageView.setImageDrawable(mergeDrawableLayers(mThumbIds[position],
R.drawable.ic_note_selected_mark));
} else {
imageView.setImageResource(mThumbIds[position]);
}
return imageView;
}
public void setSelectedItemPosition(int position) {
mSelectedPosition = position;
}
private Drawable mergeDrawableLayers(int background, int overlay) {
Drawable[] drawableLayers = new Drawable[2];
drawableLayers[0] = mContext.getResources().getDrawable(background);
drawableLayers[1] = mContext.getResources().getDrawable(overlay);
return new LayerDrawable(drawableLayers);
}
}
答案 1 :(得分:1)
我相信,如果你想要某种选择提示,你需要一个可聚焦的对象。但是,对于可聚焦对象(如Button),将OnItemClickListener附加到GridView不起作用(如果我没记错的话)。相反,您必须单独将OnClickListener附加到适配器中getView()的每个项目。
适配器:
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
Button button;
if (convertView == null) { // if it's not recycled, initialize some attributes
button = new Button(mContext);
// set layout params (make sure its GridView.layoutParams)
// and other stuff
}
else {
button = (Button) convertView;
}
button.setBackgroundResource(mThumbIds[position]); // mThumbIds hold Resource Ids
button.setOnClickListener(new OnClickListener() {
onClick(View v) {
// store directly to database here, or send it with the activity with sharedPreferences (below)
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences("MY_PREFERENCE", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("button_id", mThumbIds[position]);
// Commit the edits!
editor.commit();
}
});
return button;
}
}
在活动侧,保存按钮onClickListener:
onClick(View v) {
// Restore preferences
SharedPreferences settings = getSharedPreferences("MY_PREFERENCE", 0);
int id = settings.getInt("button_id", -1);
// now safe all stuff to database
}
可能有细节丢失,因为Button是可聚焦的,但我认为应该这样做。此外,您将通过使用.xml定义的选择器资源来实现选择。但是,这应该在一个单独的问题中解决。
编辑1: 实际上现在我想到了,我不确定drawable .xml(选择器)是否可以拥有ID。我以后必须在家里实现这个并尝试一下。
编辑2: 我添加了sharedPreference部分
编辑3: 添加了sharedPreference的活动端查询。