마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

android listview setItemChecked 질문 드립니다.

0 추천

현재 navigation drawer을 구현하면서 drawer는 fragment 화면으로 listview를 만들고있습니다.

현재 다른 홈페이지와 example을 참고해가면서 거의다 완성되었는데요.

리스트뷰 메뉴에서 아이템 클릭시 선택된 상태로 보여줬으면 해서 setitemchecked(position, true)로 설정했는데

전혀 안먹히네요. 해결법좀알수있을까요?

listview는 baseadapter 로 커스텀리스트뷰를 만들었고요 choicemode는 singlechoice로 했습니다.

코드추가

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:choiceMode="singleChoice"
    android:background="#ffffff"
    android:divider="@null"
    tools:context="com.*.*.NavigationDrawerFragment">
</ListView>
public class NavigationDrawerAdapter extends BaseAdapter {
    private Context context;
    private ArrayList<NavigationDrawerItem> items;
    private LayoutInflater inflater;
    private int layout;

    public NavigationDrawerAdapter(Context context, ArrayList<NavigationDrawerItem> items, int layout){
        this.context = context;
        this.items = items;
        this.layout = layout;
        this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

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

    public class ViewHolder{
        ImageView icon;
        TextView content;
    }

    @Override
    public View getView(int position, View cView, ViewGroup parent) {
        ViewHolder holder = null;

        if(cView == null){
            cView = inflater.inflate(layout, parent, false);
            holder = new ViewHolder();
            cView = inflater.inflate(layout,null);
            holder.icon = (ImageView)cView.findViewById(R.id.icon);
            holder.content = (TextView)cView.findViewById(R.id.content);

            cView.setTag(holder);
        } else {
            holder = (ViewHolder)cView.getTag();
        }
        holder.icon.setImageResource(items.get(position).getIcon());
        holder.content.setText(items.get(position).getContent());

        return cView;
    }
}



























public class NavigationDrawerFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER

    private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
    private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";

    private NavigationDrawerCallbacks mCallbacks;

    private ActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerListView;
    private View mFragmentContainerView;
    private ArrayList<NavigationDrawerItem> items;

    private int mCurrentSelectedPosition = 0;
    private boolean mFromSavedInstanceState;
    private boolean mUserLearnedDrawer;

    private void selectItem(int position){
        mCurrentSelectedPosition = position;

        if (mDrawerListView != null) {
            mDrawerListView.setItemChecked(position, true);
        }
        if (mDrawerLayout != null) {
            mDrawerLayout.closeDrawer(mFragmentContainerView);
        }
        if (mCallbacks != null) {
            mCallbacks.onNavigationDrawerItemSelected(position);
        }
    }

    public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar){
        mFragmentContainerView = getActivity().findViewById(fragmentId);
        mDrawerLayout = drawerLayout;

        mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, R.string.open_drawer,R.string.close_drawer){
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                if(!isAdded()){
                    return;
                }
                getActivity().supportInvalidateOptionsMenu();
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                if(!isAdded()){
                    return;
                }
                getActivity().supportInvalidateOptionsMenu();
            }
        };
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }

    private void addNavList(int icon, String content){
        items.add(new NavigationDrawerItem(icon, content));
    }

    public ActionBarDrawerToggle getDrawerToggle(){
        return mDrawerToggle;
    }

    public NavigationDrawerFragment() {
        // Required empty public constructor
    }

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

        // Read in the flag indicating whether or not the user has demonstrated awareness of the
        // drawer. See PREF_USER_LEARNED_DRAWER for details.
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
        mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);

        if (savedInstanceState != null) {
            mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
            mFromSavedInstanceState = true;
        }

        // Select either the default item (0) or the last selected item.
        selectItem(mCurrentSelectedPosition);
    }

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

        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        mDrawerListView = (ListView)inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        items = new ArrayList<NavigationDrawerItem>();

        mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                selectItem(position);
            }
        });

        addNavList(R.mipmap.ic_launcher, "***");
        addNavList(R.mipmap.ic_launcher, "***");
        addNavList(R.mipmap.ic_launcher, "***");
        addNavList(R.mipmap.ic_launcher, "***");

        mDrawerListView.setAdapter(new NavigationDrawerAdapter(getActivity(), items, R.layout.item_drawer));
        mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);

        return mDrawerListView;
    }

우랴 (3,680 포인트) 님이 2015년 3월 23일 질문
우랴님이 2015년 3월 23일 수정

4개의 답변

+1 추천
 
채택된 답변
커스텀리스트뷰에서 choice mode 사용시 리스트를 이루는 뷰는 checkable 인터페이스를 구현하고 있어야 합니다.

http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=11861
익명사용자 님이 2015년 3월 23일 답변
우랴님이 2015년 3월 24일 채택됨
0 추천
아이템이 선택되어진것은 해당 아이템만 배경색을 다른것으로 바꿔주는것으로 하실수 있을듯
nicehee (73,100 포인트) 님이 2015년 3월 23일 답변
커스텀 리스트뷰일경우에는 그 방법뿐이 없나보네요. 답변 감사드립니다 ^^
0 추천
흠 그 부분 코드좀 붙여넣어봐요.

보면 알수잇으니
Djleeee (13,180 포인트) 님이 2015년 3월 23일 답변
코드부분 추가했습니다.
–1 추천
새 프로젝트 만들 때 기본 템플릿으로 할 수 있는 것 중에 내비게이션이 있으니까 그거 참고해보세요
쎄미 (162,410 포인트) 님이 2015년 3월 23일 답변
제가 적어놓은 내용은 읽어보시고 답변을 다시는지 의문이 갑니다.
제가 질문한내용은 커스텀리스트뷰에서 setitemchecked 사용법을 물어봤습니다.
단순하게 arrayadapter를 사용하면 정상적으로 작동되는거를 확인했구요.
또한, 쎄미님께서 말씀하시는 샘플예제는 충분히 참고해가면서 코드를 작성하고있습니다. 개발하는 입장으로써 아무런 시도없이 무턱대고 질문하지않고있습니다. 답변은 감사드립니다. 수고하세요.
왼쪽에 나오는 목록 리스트뷰에서 선택된 부분이 계속 선택된 채로 보이고 싶다는거 아니었나요? 제가 이해를 잘못했나 보네요
...