2014-01-08 6 views
2

내 응용 프로그램에서 사용자가 여러 항목을 선택하면 ListView에있는 일부 스위치와 확인 버튼을 표시합니다.ListView에서 전환 상태 가져 오기

I는 버튼에 OnClickListener를() 함수를 DB에 값을 삽입 할 때 문제가 나는 스위치에서 텍스트를 검색 할 수 있지만되지 않으며 (예 참된 항상 출력) 그 상태

btn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      ListAdapter adapter = list.getAdapter(); 
      MyDatabase db = new MyDatabase(cntx); 
      db.open(); 
      for(int n=0;n<adapter.getCount();n++) 
      { 
       View rowview = adapter.getView(n, null, null); 
       Switch swtc = (Switch) rowview.findViewById(R.id.switch1); 
       String[] args = {(String)swtc.getText()}; 
       if(swtc.isChecked()) 
       { 
        Log.i("update", args[0]+" going to be true"); 
       } 
       else 
       { 
        Log.i("update", args[0]+" going to be false"); 

       } 
       int a = db.updateAlert(swtc.isChecked(), MyDatabase.Tab_Cal_Set.Cal+"=?", args); 
       Toast.makeText(cntx, "affected: "+Integer.toString(a), Toast.LENGTH_LONG).show(); 
      } 
      db.close(); 

     } 
    }); 

PS : adapter는 ListView 용으로 만든 arrayadapter이며 cntx는 응용 프로그램의 컨텍스트이고 MyDatabase는 Sqlite 데이터베이스를 관리하기 위해 제공하는 사용자 정의 클래스입니다.

public class NotificationElementList extends ArrayAdapter<String>{ 

private final Activity context; 

private final List<String> titles; 
private final List<String> imgs; 
private final List<Boolean> alert; 


public NotificationElementList(Activity context, List<String> titles, List<String> imgs, List<Boolean> alert) { 

    super(context, R.layout.list_single, titles); 
    this.context = context; 
    this.titles = titles; 
    this.imgs = imgs; 
    this.alert = alert; 

    } 

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

    LayoutInflater inflater = context.getLayoutInflater(); 

    View rowView= inflater.inflate(R.layout.notification_list_element, null, true); 

    Switch switch_text = (Switch) rowView.findViewById(R.id.switch1); 
    switch_text.setChecked(alert.get(position)); 
    switch_text.setText(titles.get(position)); 

    return rowView; 
    } 

} 당신이 방법을 ArrayAdapter.getView하는 convertView 인수를 제공하지 않는 것처럼

+0

ListView에는 어떤 어댑터를 사용하고 있습니까? 아마 BaseAdapter를 확장하고 있습니까? 어댑터 코드를 제공 할 수 있습니까? –

+0

확실합니다. 여기 있습니다. – donadev

답변

0

어댑터 getView 메소드를 호출하면 안됩니다. ListView에 의해 내부적으로 사용됩니다.
그 목적은 ListView에 내용을 채우는 방법입니다.

alert list을 사용하여 체크 상태 인 Switch을 저장하면 사용할 수 있습니다.

btn.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     MyDatabase db = new MyDatabase(cntx); 
     db.open(); 
     for(int n=0;n<alert.size();n++) 
     { 
      String[] args = {titles.get(n)}; 
      if(alert.get(n)) 
      { 
       Log.i("update", args[0]+" going to be true"); 
      } 
      else 
      { 
       Log.i("update", args[0]+" going to be false"); 

      } 
      int a = db.updateAlert(alert.get(n), MyDatabase.Tab_Cal_Set.Cal+"=?", args); 
      Toast.makeText(cntx, "affected: "+Integer.toString(a), Toast.LENGTH_LONG).show(); 
     } 
     db.close(); 

    } 
}); 
1

, 그것은 항상 당신을 위해 새로운 뷰 계층 구조를 만들 것입니다 : 당신이 나에게 ArrayAdapter와의

코드를 도울 수 있기를 바랍니다. 결과적으로 스위치 위젯의 상태는 alert.get (위치)으로 초기화됩니다.

스위치 상태가 변경 될 때마다 OnCheckedChangeListener를 설정하여 위젯을 전환하고 모델을 업데이트 할 수 있습니다. 귀하의 버튼 클릭 이벤트 처리기에서 스위치 위젯에서 그것을 얻기 위해 노력하고 반대로 당신이 모델에서 직접 상태를 얻을 수 있도록 이렇게이

@Override 
public View getView(final int position, View view, ViewGroup parent) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    View rowView = inflater.inflate(R.layout.notification_list_element, null, true); 

    Switch s = (Switch) rowView.findViewById(R.id.switch1); 
    s.setChecked(alert.get(position)); 
    s.setText(titles.get(position)); 
    s.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      alert.set(position, isChecked); 
     } 
    }); 

    return rowView; 
} 

같은 예를 들어. 대신이

View rowview = adapter.getView(n, null, null); 
Switch swtc = (Switch) rowview.findViewById(R.id.switch1);  
db.updateAlert(swtc.isChecked(), MyDatabase.Tab_Cal_Set.Cal+"=?", args); 

을하는 당신은 또한

db.updateAlert(alert.get(n), MyDatabase.Tab_Cal_Set.Cal+"=?", args); 

할 것, 난 당신이 더 나은 성능을 위해 view holder pattern을 활용할 수있는 어댑터를 업데이트하는 것이 좋습니다.

관련 문제