getView() 方法中的 onClickListener 弄乱了 MultiChoiceModeListener()
onClickListener in getView() method messes up MultiChoiceModeListener()
所以我有一个实现多选模式侦听器的 GridView,每次用户点击该项目时,它应该更改它的背景图像;当 he/she 长按时,应该会出现多选工具栏。
然而,由于我在 getView() 中有点击侦听器,它以某种方式阻止了另一个。
(如果我从 getView() 中删除监听器,另一个就可以正常工作)
有什么建议吗?
这是我的代码:
MultiChoiceListener:
gView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
checkedPos = new SparseBooleanArray();
gView.setMultiChoiceModeListener(new GridView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
currentArray = gView.getCheckedItemPositions();
int itemCount = gView.getCheckedItemCount();
switch (itemCount){
case 1:
mode.setSubtitle("One item selected.");
break;
default:
mode.setSubtitle(itemCount + " items selected.");
break;
}
...
getView():
convertView.setLongClickable(true);
final Holder finalHolder = holder;
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!pressed) {
finalHolder.img.setBackground(ContextCompat.getDrawable(context, R.drawable.ic_pause_bg));
pressed = true;
}
else{
finalHolder.img.setBackground(ContextCompat.getDrawable(context, R.drawable.ic_noise_bg));
pressed = false;
}
}
});
感谢您的宝贵时间!
没关系,我解决了。如果有人需要解决同样问题的方法,我会留下我的答案。
首先忘掉 getView() 方法中的侦听器,而是转到具有 MultiChoiseModeListener 代码的地方,然后为您的 gridView 调用 setOnItemClickListener() -> 使用您要不断更改的图像的 ID:
gView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
view.setSelected(true);
ImageView image = (ImageView) view.findViewById(R.id.noise_image); //use the id given in your layout
if(!itemPressed.get(position)) {
image.setBackground(ContextCompat
.getDrawable(mContext, R.drawable.ic_running));
itemPressed.put(position,true);
}
else{
itemPressed.put(position,false);
image.setBackground(ContextCompat.getDrawable(mContext,R.drawable.ic_normal));
}
这样做,两个监听器都会工作。
Notice that itemPressed is a Map in order to memorize
which item was clicked so when changing background images , there is
no confusion.
所以我有一个实现多选模式侦听器的 GridView,每次用户点击该项目时,它应该更改它的背景图像;当 he/she 长按时,应该会出现多选工具栏。
然而,由于我在 getView() 中有点击侦听器,它以某种方式阻止了另一个。
(如果我从 getView() 中删除监听器,另一个就可以正常工作)
有什么建议吗?
这是我的代码:
MultiChoiceListener:
gView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
checkedPos = new SparseBooleanArray();
gView.setMultiChoiceModeListener(new GridView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
currentArray = gView.getCheckedItemPositions();
int itemCount = gView.getCheckedItemCount();
switch (itemCount){
case 1:
mode.setSubtitle("One item selected.");
break;
default:
mode.setSubtitle(itemCount + " items selected.");
break;
}
...
getView():
convertView.setLongClickable(true);
final Holder finalHolder = holder;
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!pressed) {
finalHolder.img.setBackground(ContextCompat.getDrawable(context, R.drawable.ic_pause_bg));
pressed = true;
}
else{
finalHolder.img.setBackground(ContextCompat.getDrawable(context, R.drawable.ic_noise_bg));
pressed = false;
}
}
});
感谢您的宝贵时间!
没关系,我解决了。如果有人需要解决同样问题的方法,我会留下我的答案。
首先忘掉 getView() 方法中的侦听器,而是转到具有 MultiChoiseModeListener 代码的地方,然后为您的 gridView 调用 setOnItemClickListener() -> 使用您要不断更改的图像的 ID:
gView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
view.setSelected(true);
ImageView image = (ImageView) view.findViewById(R.id.noise_image); //use the id given in your layout
if(!itemPressed.get(position)) {
image.setBackground(ContextCompat
.getDrawable(mContext, R.drawable.ic_running));
itemPressed.put(position,true);
}
else{
itemPressed.put(position,false);
image.setBackground(ContextCompat.getDrawable(mContext,R.drawable.ic_normal));
}
这样做,两个监听器都会工作。
Notice that itemPressed is a Map in order to memorize which item was clicked so when changing background images , there is no confusion.