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

리스트뷰 체크상태 유지하는방법 도움요청합니다..

0 추천

여기저기 찾아보고 구글링도 4시간 가량 했습니다만, 

어떤 방법은 강제종료되고 어떤 방법은 유지가 안됩니다..

어떻게 적용해야하는지 모르겠어서 도움을요청합니다..

 

 

public class Activity extends AppCompatActivity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);


        //액션바 설정하기//
        //액션바 타이틀 변경하기
        getSupportActionBar().setTitle("순서변경");
        //홈버튼 표시
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        ListView listview;
        CustomChoiceListViewAdapter adapter;

        // Adapter 생성
        adapter = new CustomChoiceListViewAdapter();

        // 리스트뷰 참조 및 Adapter달기
        listview = (ListView) findViewById(R.id.listview1);
        listview.setAdapter(adapter);

        // 첫 번째 아이템 추가. 
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a1),
                "첫번째");
        // 두 번째 아이템 추가.
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a2),
                "두번째");
        // 세 번째 아이템 추가.
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a3),
                "세번째");
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a4),
                "네번째");
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a5),
                "다섯번째");
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a6),
                "여섯번째");
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a7),
                "일곱번째");
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a8),
                "여덟번째");
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a9),
                "아홉번째");
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a10),
                "열번째");

    }

    // 뒤로가기버튼
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

 

public class ListViewItem {
    private Drawable icon ;
    private String text ;

    public void setIcon(Drawable icon) {
        this.icon = icon ;
    }
    public void setText(String text) {
        this.text = text ;
    }

    public Drawable getIcon() {
        return this.icon ;
    }

    public String getText() {
        return this.text ;
    }
}

 

public class CustomChoiceListViewAdapter extends BaseAdapter{






    // Adapter에 추가된 데이터를 저장하기 위한 ArrayList
    private ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>() ;


    // ListViewAdapter의 생성자
    public CustomChoiceListViewAdapter() { }






    // Adapter에 사용되는 데이터의 개수를 리턴. : 필수 구현
    @Override
    public int getCount() {
        return listViewItemList.size() ;
    }

    // position에 위치한 데이터를 화면에 출력하는데 사용될 View를 리턴. : 필수 구현
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {




        final int pos = position;
        final Context context = parent.getContext();

        // "listview_item" Layout을 inflate하여 convertView 참조 획득.
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.item_order, parent, false);
        }

        // 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 참조 획득
        ImageView iconImageView = (ImageView) convertView.findViewById(R.id.imageview1) ;
        TextView textTextView = (TextView) convertView.findViewById(R.id.text_name) ;

        // Data Set(listViewItemList)에서 position에 위치한 데이터 참조 획득
        ListViewItem listViewItem = listViewItemList.get(position);

        // 아이템 내 각 위젯에 데이터 반영
        iconImageView.setImageDrawable(listViewItem.getIcon());
        textTextView.setText(listViewItem.getText());



        return convertView;
    }





    // 지정한 위치(position)에 있는 데이터와 관계된 아이템(row)의 ID를 리턴. : 필수 구현
    @Override
    public long getItemId(int position) {
        return position ;
    }

    // 지정한 위치(position)에 있는 데이터 리턴 : 필수 구현
    @Override
    public Object getItem(int position) {
        return listViewItemList.get(position) ;
    }

    // 아이템 데이터 추가를 위한 함수. 개발자가 원하는대로 작성 가능.
    public void addItem(Drawable icon, String text) {
        ListViewItem item = new ListViewItem();

        item.setIcon(icon);
        item.setText(text);

        listViewItemList.add(item);
    }
}

 

public class CheckableLinearLayout extends LinearLayout implements Checkable {








    // 만약 CheckBox가 아닌 View를 추가한다면 아래의 변수 사용 가능.
    // private boolean mIsChecked ;

    public CheckableLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        // mIsChecked = false ;
    }

    @Override
    public boolean isChecked() {
        CheckBox cb = (CheckBox) findViewById(R.id.checkBox1) ;

        return cb.isChecked() ;
        // return mIsChecked ;
    }

    @Override
    public void toggle() {
        CheckBox cb = (CheckBox) findViewById(R.id.checkBox1) ;

        setChecked(cb.isChecked() ? false : true) ;
        // setChecked(mIsChecked ? false : true) ;
    }

    @Override
    public void setChecked(boolean checked) {
        CheckBox cb = (CheckBox) findViewById(R.id.checkBox1) ;

        if (cb.isChecked() != checked) {
            cb.setChecked(checked) ;
        }

        // CheckBox 가 아닌 View의 상태 변경.
    }




}
익명사용자 님이 2017년 7월 12일 질문
커스텀 리스트뷰 체크박스 이런 키워드로 검색해보세요.
저같은 경우엔 sharedpreference로 체크한 포지션을 저장했다가 뿌려줬어요.

1개의 답변

0 추천
getView에서 새로그려서 그래요

데이터리스트 클래스에 체크여부값 저장할 변수하나 넣어 주시구 체크리스너에서 set

getView에서 확인해서 체크해주셔야되요
익명사용자 님이 2017년 7월 13일 답변
...