2016-10-27 2 views
0

베이스 어댑터와 함께 체크 된 textview를 사용하여 listview를 채우지 만 괜찮습니다. 그러나 CheckedTextView를 스크롤하려고하면 selection.please가 손실되어 코드를 찾아 도와줍니다.체크 된 텍스트보기에 문제가 있습니다

public class AttendancePage extends AppCompatActivity { 

    List<String> studentNames = new ArrayList<String>(); 
    String[] sNames; 

    DatabaseHelper databaseHelper; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_attendance_page); 
     databaseHelper = new DatabaseHelper(getApplicationContext()); 
     Cursor res = databaseHelper.getStudentNames(); 
     setTitle("Attendance Sheet"); 

     ListView listView = (ListView) findViewById(R.id.listView); 

     while (res.moveToNext()) { 
      studentNames.add(res.getString(0)); 
     } 

     sNames = new String[studentNames.size()]; 
     sNames = studentNames.toArray(sNames); 

     Student_Attandence_Addapter customAdapter = new Student_Attandence_Addapter(getApplicationContext(), sNames); 
     listView.setAdapter(customAdapter); 

     Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar); 
     setSupportActionBar(myToolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     return super.onCreateOptionsMenu(menu); 
    } 
} 

내 사용자 정의 어댑터 클래스 :

public class Student_Attandence_Adapter extends BaseAdapter { 

    String[] names; 
    Context context; 
    LayoutInflater inflter; 
    String value; 

    public Student_Attandence_Adapter(Context context, String[] names) { 
     this.context = context; 
     this.names = names; 
     inflter = (LayoutInflater.from(context)); 

    } 

    @Override 
    public int getCount() { 
     return names.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

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

    @Override 
    public View getView(int position, View view, ViewGroup parent) { 
     view = inflter.inflate(R.layout.student_attandence_listview, null); 
     final CheckedTextView simpleCheckedTextView = (CheckedTextView) view.findViewById(R.id.simpleCheckedTextView); 
     simpleCheckedTextView.setText(names[position]); 
     simpleCheckedTextView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (simpleCheckedTextView.isChecked()) { 
        value = "un-Checked"; 
        simpleCheckedTextView.setCheckMarkDrawable(0); 
        simpleCheckedTextView.setChecked(false); 
       } else { 
        value = "Checked"; 
        simpleCheckedTextView.setCheckMarkDrawable(R.drawable.checked); 
        simpleCheckedTextView.setChecked(true); 
       } 
      } 
     }); 
     return view; 
    } 
} 

답변

1

는 기본적으로 무슨 일하면 ChekedTextView의 상태가의 getView 방법은 목록 항목의 이전 캐시 상태에 따라 호출 될 때마다 재설정 될 것입니다. 간단히 말하면 아이템의 체크 된 상태를 저장해야하고 getView 메소드가 호출 될 때 다시 설정해야합니다. 예를 들어, 당신은 테마의 이름과 확인 상태

public class Student { 
    private String name; 
    private boolean checked; 

    public Student(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
    } 

    public boolean isChecked() { 
     return checked; 
    } 
} 

과 같이하게 될의 getView 방법을 포함하는 객체,

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    /* 
    * ListView caches the view so only inflate when there 
    * is no cached view aka null 
    */ 
    if (view == null) { 
     view = inflter.inflate(R.layout.student_attandence_listview, null); 
    } 

    Student aStudent = students[position]; 

    final CheckedTextView simpleCheckedTextView = (CheckedTextView) view.findViewById(R.id.simpleCheckedTextView); 
    simpleCheckedTextView.setText(aStudent.getName()); 
    simpleCheckedTextView.setCheckMarkDrawable(aStudent.isChecked() ? R.drawable.checked : 0); 
    simpleCheckedTextView.setChecked(aStudent.isChecked()); 

    simpleCheckedTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (simpleCheckedTextView.isChecked()) { 
       aStudent.setChecked(false); 
       notifyDataSetChanged(); 
      } else { 
       aStudent.setChecked(true); 
       notifyDataSetChanged(); 
      } 
     } 
    }); 
    return view; 
} 

이 필요합니다. 필요에 따라 수정하십시오.

+0

감사합니다. anwarshahriar 선생님 ... 정말 답답합니다. 이제 내 응용 프로그램이 멋지게 작동합니다 .. –

+0

다행이 들리니 다행입니다. BTW는 ListView 대신 RecyclerView로 마이그레이션 해보십시오. 새로운 표준입니다. 행복한 코딩. – anwarshahriar

관련 문제