2

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 によって行われた場合には機能しません。

問題を明確に説明したことを願っています。助けていただければ幸いです。

4

0 に答える 0