0

GridView私のアプリの は複数の で構成されていますImageButtons。をタップするImageButtonと、その ImageButton の画像リソースが変化します。

ImageButtonがタップされていない場合の画像リソース ID の int 配列です。

private final int mineIcons[] = 
{
    R.drawable.habit,
    R.drawable.story,
    R.drawable.submenu_voice_message,
    R.drawable.study,
    R.drawable.guess,
    R.drawable.poem,
    R.drawable.add
};

ImageButtonこれは、がタップされたときの画像リソース ID の int 配列です。

private final int mineIconsSelected[] = 
{
    R.drawable.habit_selected,
    R.drawable.story_selected,
    R.drawable.submenu_voice_message_selected,
    R.drawable.study_selected,
    R.drawable.guess_selected,
    R.drawable.poem_selected,
    R.drawable.add
};

このアクティビティがロードされたとき、最初のアクティビティが「タップされた」状態であることを望みImageButtonますGridView。そのため、この int 配列の画像リソース ID を、ロードImageButtons時のデフォルトの画像リソースに設定しますImageButtons

private final int mineIconsDefault[] = 
{
    R.drawable.habit_selected,
    R.drawable.story,
    R.drawable.submenu_voice_message,
    R.drawable.study,
    R.drawable.guess,
    R.drawable.poem,
    R.drawable.add
};

これはの完全なコードですFragment

public class MineFragment extends Fragment { private final static String LOG_TAG = "MineFragment";

private final int mineIcons[] = 
{
    R.drawable.habit,
    R.drawable.story,
    R.drawable.submenu_voice_message,
    R.drawable.study,
    R.drawable.guess,
    R.drawable.poem,
    R.drawable.add
};

private final int mineIconsSelected[] = 
{
    R.drawable.habit_selected,
    R.drawable.story_selected,
    R.drawable.submenu_voice_message_selected,
    R.drawable.study_selected,
    R.drawable.guess_selected,
    R.drawable.poem_selected,
    R.drawable.add
};

private SparseArray<ImageButton> submenuIconArray = new SparseArray<ImageButton>();
private SubMenuListAdapter submenuListAdapter = new SubMenuListAdapter();
private MineListAdapter mineListAdapter = new MineListAdapter();

private GridView gvSubmenu;
private ListView lvMine;

private int selectedItemNumber = 0;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_mine, container, false);
    init(view);

    return view;
}

private void init(View view)
{
    lvMine = (ListView)view.findViewById(R.id.lv_mine);
    lvMine.setAdapter(mineListAdapter);

    gvSubmenu = (GridView)getActivity().findViewById(android.R.id.content).findViewById(R.id.gv_submenu);
    gvSubmenu.setAdapter(submenuListAdapter);
}

public void showSubmenu()
{
    if(gvSubmenu != null)
    {
        gvSubmenu.setVisibility(View.VISIBLE);
    }
}

public void hideSubmenu()
{
    if(gvSubmenu != null)
    {
        gvSubmenu.setVisibility(View.GONE);
    }
}

private class SubMenuListAdapter extends BaseAdapter
{       
    private final int mineIconsDefault[] = 
    {
        R.drawable.habit_selected,
        R.drawable.story,
        R.drawable.submenu_voice_message,
        R.drawable.study,
        R.drawable.guess,
        R.drawable.poem,
        R.drawable.add
    };

    @Override
    public int getCount() 
    {
        return mineIconsDefault.length;
    }

    @Override
    public Object getItem(int position) 
    {
        return mineIconsDefault[position];
    }

    @Override
    public long getItemId(int arg0) 
    {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup root) 
    {
        if(convertView == null)
        {
            convertView = LayoutInflater.from(getActivity().getApplicationContext()).inflate(R.layout.list_item_submenu, root, false);
        }

        ImageButton ibSubmenuIcon = (ImageButton)convertView.findViewById(R.id.ib_item_submenu_icon);
        ibSubmenuIcon.setImageResource(mineIconsDefault[position]);
        ibSubmenuIcon.setOnClickListener(new OnClickListener() 
        {   
            @Override
            public void onClick(View arg0) 
            {
                submenuIconArray.get(selectedItemNumber).setImageResource(mineIcons[selectedItemNumber]);
                submenuIconArray.get(position).setImageResource(mineIconsSelected[position]);

                selectedItemNumber = position;
            }
        });

        submenuIconArray.append(position, ibSubmenuIcon);

        return convertView;
    }
}

private class MineListAdapter extends BaseAdapter
{
    //temp 
    private String[] tempListItems = {"item 1", "item 2", "item 3", "item 4", "item 5"};

    @Override
    public int getCount() 
    {
        return tempListItems.length;
    }

    @Override
    public Object getItem(int arg0) 
    {
        return tempListItems[arg0];
    }

    @Override
    public long getItemId(int arg0) 
    {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup root) 
    {
        if(convertView == null)
        {
            convertView = LayoutInflater.from(getActivity().getApplicationContext()).inflate(R.layout.list_item_layout_1, root, false);
        }

        ImageView ivItemIcon = (ImageView)convertView.findViewById(R.id.iv_item_icon);
        TextView tvItemLabel = (TextView)convertView.findViewById(R.id.tv_item_label);

        tvItemLabel.setText(tempListItems[position]);

        return convertView;
    }
}

}

ロードされたそれぞれをSparseArrayに格納して、後で の画像リソースを変更する必要があるときに、からそれを取得し、その画像リソースをint 配列内の対応するものに設定するだけです。それを行う前に、以前にタップした画像リソースがint 配列内の対応する画像リソースに設定されていることを確認します。ImageButtonGridViewImageButtonImageButtonSparseArraymineIconsSelectedImageButtonmineIcons

ここで、奇妙な問題が発生します。

最初のものを除いて、タップ時にImageButton保存されている画像リソースを正常に変更できました。何度コードをチェックしても、ログを作成しても、どこに問題があるのか​​ わかりません。SparseArray

私を助けてください。どうもありがとう!

4

1 に答える 1

2

最初にコードを単純化することを強くお勧めします。そうすることで、問題が解決するか、デバッグがはるかに簡単になります。非常に多くのボタンがあるため、最初は少し面倒ですが、コードがより管理しやすくなります。ボタンごとに単純なセレクタ ドローアブル ファイルを作成します。つまり、習慣ボタンの場合:habit_selector.xml(描画可能なフォルダーに配置)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/habit" android:android:state_selected="true"/>
    <item android:drawable="@drawable/habit_selected"/>
</selector>

次に、ボタンに設定します。

private final int mineIconSelectors[] = 
{
    R.drawable.habit_selector,
    R.drawable.story_selector,
    R.drawable.submenu_voice_message_selector,
    ...
}

    ...
    ImageButton ibSubmenuIcon = (ImageButton)convertView.findViewById(R.id.ib_item_submenu_icon);
    ibSubmenuIcon.setBackground(mineIconSelectors[position]);

したがって、ボタンが選択されると、Android は自動的にドローアブル アセットを切り替えます。

于 2015-07-24T03:26:27.453 に答える