GridView 用のカスタム アダプターがあり、カスタム ビューがグリッドのクリック イベントを吸収するため、独自の選択処理を実装しました。すべてうまくいきましたが、コードでアイテムを選択する機能を追加したいと思います。このための関数を作成し、アクティビティから呼び出しましたが、ユーザーが別の項目を選択すると、選択された項目 (選択を示す) のコードの背景が更新されません! postInvalidate を呼び出してみましたが、効果はありませんでした。アダプターのコードは次のとおりです。
class PaintActionsAdapter extends BaseAdapter
{
private Context context;
private View[] listItemsViews;
private OnListItemClickListener itemClickListener;
private int[] actionsImagesResources;
private int lastSelectedPosition=-1;
private int pendingSelectedPosition=-1;
private class ActionButtonClickListener implements View.OnClickListener
{
private int position;
public ActionButtonClickListener(int position)
{ this.position=position; }
public void onClick(View view)
{
changeSelectedListItem(position);
if (itemClickListener!=null)
itemClickListener.onListItemClick(view,position);
}
}
public PaintActionsAdapter(Context context,OnListItemClickListener
itemClickListener)
{
if (context==null)
throw new IllegalArgumentException("The context must be non-null!");
this.context=context;
this.itemClickListener=itemClickListener;
TypedArray imagesResourcesNames=context.getResources().obtainTypedArray(
R.array.actions_images);
actionsImagesResources=new int[imagesResourcesNames.length()];
for (int counter=0;counter<actionsImagesResources.length;counter++)
{
actionsImagesResources[counter]=imagesResourcesNames.getResourceId(
counter,-1);
}
imagesResourcesNames.recycle();
listItemsViews=new View[actionsImagesResources.length];
}
public int getCount() { return actionsImagesResources.length; }
public long getItemId(int position)
{ return actionsImagesResources[position]; }
public Object getItem(int position)
{ return actionsImagesResources[position]; }
public View getView(int position,View convertView,ViewGroup parent)
{
ImageView actionImageView;
if (convertView==null)
{
actionImageView=new ImageView(context);
/*actionToggleButton=new ToggleButton(context);
actionToggleButton.setTextOn(null);
actionToggleButton.setTextOff(null);
actionToggleButton.setText(null);*/
AbsListView.LayoutParams layoutParams=new AbsListView.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.
WRAP_CONTENT);
actionImageView.setLayoutParams(layoutParams);
}
else actionImageView=(ImageView)convertView;
actionImageView.setImageResource(actionsImagesResources[position]);
actionImageView.setOnClickListener(new ActionButtonClickListener(position));
listItemsViews[position]=actionImageView;
if (pendingSelectedPosition==position)
{
changeSelectedListItem(position);
pendingSelectedPosition=-1;
}
return actionImageView;
}
public void setSelectedListItem(int position)
{
if ((position<0)||(position>actionsImagesResources.length))
throw new IndexOutOfBoundsException("The position of the list " +
"item to select must be between 0 and " + actionsImagesResources.
length + "! The value supplied was " + position);
if (listItemsViews[position]==null) pendingSelectedPosition=position;
else changeSelectedListItem(position);
}
private void changeSelectedListItem(int position)
{
listItemsViews[position].setBackgroundResource(R.drawable.
actions_list_selector);
if (lastSelectedPosition>-1)
{
listItemsViews[lastSelectedPosition].setBackgroundResource(0);
listItemsViews[lastSelectedPosition].postInvalidate();
}
lastSelectedPosition=position;
}
}
関数 setSelectedListItem は、アクティビティが選択を変更できるようにし、setBackgroundResource(0) を使用して最後に選択されたアイテムから選択指示を削除する changeSelectedListItem を呼び出します。これは、ユーザーが項目をクリックして選択した場合には完全に機能しますが、最後の項目の選択が setSelectedListItem によって行われた場合には機能しません。
問題を明確に説明したことを願っています。助けていただければ幸いです。