listview條目用狀態選擇器沒反應


button和imagebutton天生具有“可點擊(click)”、“可按下(press)”的特性,radiobutton具有“可勾選(check)”的特性,但是listview的條目只有“可按下(press)”的特性,所以下面代碼不起作用:

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

</selector>

 

listview的條目有enabled 特性,所以狀態選擇器這樣寫:

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

</selector>

 然后代碼還要做些處理(紅色代碼部分就是需要做的處理):

public class LeftMenuFragment extends BaseFragment {

    @ViewInject(R.id.lv_list)
    private ListView lvList;

    private ArrayList<NewsMenuData> mNewsMenuData;// 側邊欄網絡數據對象

    private int mCurrentPos;// 當前被選中的item的位置

    private LeftMenuAdapter mAdapter;

    @Override
    public View initView() {
        View view = View.inflate(mActivity, R.layout.fragment_left_menu, null);
        // lvList = (ListView) view.findViewById(R.id.lv_list);
        ViewUtils.inject(this, view);// 注入view和事件
        return view;
    }

    @Override
    public void initData() {
    }

    // 給側邊欄設置數據
    public void setMenuData(ArrayList<NewsMenuData> data) {
        mCurrentPos = 0;//當前選中的位置歸零
        
        // 更新頁面
        mNewsMenuData = data;

        mAdapter = new LeftMenuAdapter();
        lvList.setAdapter(mAdapter);

 lvList.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                mCurrentPos = position;// 更新當前被選中的位置
                mAdapter.notifyDataSetChanged();// 刷新listview

                // 收起側邊欄
                toggle();

                // 側邊欄點擊之后, 要修改新聞中心的FrameLayout中的內容
                setCurrentDetailPager(position);
        } });
    }

    /**
     * 設置當前菜單詳情頁
     * 
     * @param position
     */
    protected void setCurrentDetailPager(int position) {
        // 獲取新聞中心的對象
        MainActivity mainUI = (MainActivity) mActivity;
        // 獲取ContentFragment
        ContentFragment fragment = mainUI.getContentFragment();
        // 獲取NewsCenterPager
        NewsCenterPager newsCenterPager = fragment.getNewsCenterPager();
        // 修改新聞中心的FrameLayout的布局
        newsCenterPager.setCurrentDetailPager(position);
    }

    /**
     * 打開或者關閉側邊欄
     */
    protected void toggle() {
        MainActivity mainUI = (MainActivity) mActivity;
        SlidingMenu slidingMenu = mainUI.getSlidingMenu();
        slidingMenu.toggle();// 如果當前狀態是開, 調用后就關; 反之亦然
    }

    class LeftMenuAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return mNewsMenuData.size();
        }

        @Override
        public NewsMenuData getItem(int position) {
            return mNewsMenuData.get(position);
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = View.inflate(mActivity, R.layout.list_item_left_menu,
                    null);
            TextView tvMenu = (TextView) view.findViewById(R.id.tv_menu);

            NewsMenuData item = getItem(position);
            tvMenu.setText(item.title);

            if (position == mCurrentPos) {
                // 被選中
                tvMenu.setEnabled(true);// 文字變為紅色
            } else {
                // 未選中
                tvMenu.setEnabled(false);// 文字變為白色
            }

            return view;
        }

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM