2016-10-27 22 views
0

リストアを行うためにチェックされたtextviewをベースアダプタで使用しましたが、うまくいきましたが、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); 
    } 
} 

マイカスタムアダプタクラス:GetViewメソッドは、リスト項目の以前のキャッシュされた状態に応じて呼び出されるたび

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メソッドが呼び出されるときには、再度設定する必要があります。たとえば、あなたは、テーマの名前とチェックされた状態

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

本当にありがとうございました。あなたの答えにとても満足しています。今私のアプリは素晴らしい仕事をしています.. –

+0

それは動作することを聞いてうれしい。 BTWはListViewの代わりにRecyclerViewに移行しようとしています。これは新しい標準です。ハッピーコーディング。 – anwarshahriar

関連する問題