2012-05-11 3 views
0

ListView 내에서 실제로 확인란의 결과를 유지하는 방법을 설명하는 곳에서는 기사 하나를 찾을 수 없습니다. 많음은 표시하는 방법을 보여 주지만 모두 저장하는 방법을 생략합니다.목록보기에서 파일에 체크 된 항목 저장

메뉴 항목에서 '즐겨 찾기 설정'을 클릭하면 이름 목록을로드하고 각각에 체크 박스를 표시하고 싶습니다. 나는 여러 개의 '점검'을 할 수 있기를 원합니다. 그런 다음 확인 된 설정으로 목록을 SD 카드의 영구 저장 장치에 저장할 수 있기를 원합니다. 목록에는 "name"값과 "isChecked"값이 포함되어 있어야합니다.

내 문제는 구조와 범위 중 하나라고 생각하므로 모든 코드가 아닌 아래 구조 만 보여줍니다. 오히려 메인 메뉴 활성 구문

보다는 I 커스텀 어댑터에리스트 (checkedlist)를 통과

public class SetFavourites extends ListActivity { 
/** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    . 
    . 
    FavouritesAdapter adapter = new FavouritesAdapter(this, checkedList); 
    setListAdapter(adapter); 

} 

어댑터 체크 박스 내가이 시점에서 변경되어,마다 onCheckedChangeListener을 갖는다 // 여기에 내가 붙어있는 곳이 있는데, 그 행의 이름과 값을 확인할 것입니다.

public class FavouritesAdapter extends ArrayAdapter<JSONObject> implements OnCheckedChangeListener { 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

} 

@Override 
public void onCheckedChanged(CompoundButton cb, boolean isChecked) { 

    JSONObject checked = getItem(posSelected); 

    // Here's where I'm stuck 
} 


} 

내 질문에 어떻게 여러 체크 이벤트가있는 경우 데이터를 유지할 수 있습니까?

행 이름과 체크 된 상태를 보유 할 모델을 작성한 경우, 활동에서 또는 어댑터에서 모델을 어디에서 인스턴스화합니까?

어댑터 내에서 '확인'이 완료되면 알려주는 이벤트가 없으므로 모델에 추가 할 수는 있지만 저장할 수는 없습니다.

어댑터가 모델을 인스턴스화하는 경우 주 활동에서 어떻게 저장합니까? 데이터 저장을 완료하는 데 사용할 수있는 이벤트는 무엇입니까? 뒤로 버튼 메소드 (기본 액티비티 내에서 정의되므로 어댑터 내에서 작동 할 수 없음) 또는 액티비티 onStop() 메소드와 비슷합니다.

액티비티에서 데이터 모델을 인스턴스화하고 전달하면 다시 전달되어 저장됩니다.

자세히 알 수 있듯이, 나는이 문제에 어떻게 접근해야하는지 완전히 혼동합니다.

감사

+0

SharedPreferences를 저장하려는 경우이를 유지하는 것이 더 좋은 옵션 인 것 같습니다. 또한 구현하기가 더 쉬울 것입니다. http://developer.android.com/reference/android/content/SharedPreferences.html – FoamyGuy

+0

어떤 데이터 유형의 배열 목록에 상태를 저장 한 다음 json 배열로 변환하고 json 문자열을 환경 설정에 serialize합니다. 거대한 목록이 아니라고 가정하면 GSON을 사용하여 훨씬 쉽게 만들 수 있습니다. 이 작업을 수행하기 위해 어댑터에 메서드를 추가하기 만하면됩니다. 일반적으로 데이터를 유지할 위치는 활동의 onPause입니다. 그래서 adapter.saveState() 또는 그런 것. – Idistic

답변

1

내가 JSON을 사용하지 않은하지만 난 SQLite 데이터베이스를 사용하여 비슷한 상황을 가지고있다.

어쩌면 내가 다루는 방법을 보여주는 대략적인 레이아웃을 제공 할 수 있으며 JSON 비트를 채워 사용자의 요구에 맞출 수 있습니다.배열 설정 사용자 지정 어댑터에서

: 외부 버튼에 대한 다음

@Override 
public void onCheckedChanged(CompoundButton cb, boolean isChecked) { 
    if(isChecked == true){ 
     checked[posSelected] = 1; 
    } else { 
     checked[posSelected] = 0; 
    } 
} 

온 클릭 : onCheckedChanged 당신의 그런

public FavouritesAdapter(Context context, int layout, Cursor c, 
     String[] from, int[] to) { 
    super(context, layout, c, from, to); 

    initializeChecked(); 
} 

public static void initializeChecked() { 
    checked = new int[c.getCount()]; 
    int i = 0; 
    while (i < c.getCount()) { 
     checked[i] = 0; 
     i++; 
    } 
} 

:

public static int[] checked; 

는 생성자가 변경 사항을 커밋 할 목록 :

commit.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     int i = 0; 
     itemCursor.moveToFirst(); // existing cursor backing the list 
     while (itemCursor.isAfterLast() == false) { // iterate through cursor and match checked with rows 
      if (FavouritesAdapter.checked[i] == 1) { 
       // do your save to db/file/whatever here 
     } 
     i++; 
     itemCursor.moveToNext(); 
    } 
}; 

귀하의 사례에 국한되지는 않지만 잘하면 도움이 될 것입니다.

+0

이 답변은 '정적'클래스 변수와 생성자를 완전히 이해하지 못하는 조합 인 '로그 걸림'을 극복 할 수있을만큼 충분히 가깝습니다. 나는 그것을 정리할 때 내 자신의 코드를 올릴 것이다. – Mitch

+0

다행이다. 나는 JSON을 어떻게 사용하는지 정확히 알지 못했지만, 기본은 다소 같아야한다. . 나는 당신의 코드를 보길 기대하며, 새로운 것을 가르쳐 주어야합니다. – Barak

관련 문제