Невозможно отобразить выбранные несколько элементов в тосте, где установлен флажок

#android #checkbox

#Android #флажок

Вопрос:

Я могу загружать данные из базы данных в свой пользовательский ListView, но не могу отобразить элемент (релевантный, если быть точным, имя курса), когда установлен флажок (можно установить несколько флажков) на тосте, когда я нажимаю кнопку.

Вот мой код адаптера:

     public class CourseSelectionAdapter extends ArrayAdapter<CourseDisplay>{


    private Context mContext;
    private LayoutInflater mInflater;
    int layoutResourceId;
    public static List<CourseDisplay> mDataSource;
    public static int checkBoxCounter;


    public CourseSelectionAdapter(Context context, int layoutResourceId, List<CourseDisplay> items) {
        super(context, layoutResourceId, items);

        mContext = context;
        mDataSource = items;
        this.layoutResourceId = layoutResourceId;
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        checkBoxCounter = 0;


    }

    @Override
    public int getCount() {
        return mDataSource.size();
    }

    @Override
    public CourseDisplay getItem(int position) {
        return mDataSource.get(position);
    }

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

    //4
    @Override
    public View getView(int position, final View convertView, ViewGroup parent) {
        // Get view for row item
        View row = convertView;
        ViewHolder holder;
        holder = null;
        CourseDisplay courseDisplay = getCourse(position);
// 1
        if (row == null) {

            // 2
            row = mInflater.inflate(R.layout.custom_listview_layout, parent, false);

            // 3
            holder = new ViewHolder();


            holder.courseCodeTextView = (TextView) row.findViewById(R.id.course_id_display);
            holder.courseNameTextView = (TextView) row.findViewById(R.id.course_name_display);
            holder.courseSelectedCheckBox = (CheckBox) row.findViewById(R.id.course_selection_checkbox);

            holder.courseCodeTextView.setText(courseDisplay.getCourseCode());
            holder.courseNameTextView.setText(courseDisplay.getCourseName());

            holder.courseSelectedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    if (isChecked){
                        checkBoxCounter  ;
                        getCourse((Integer) buttonView.getTag()).getCourseSelected();

                    }else {
                        checkBoxCounter--;
                    }
                    System.out.println("Count is: "  checkBoxCounter);
                }
            });
            // 4
            row.setTag(holder);
        } else {
            // 5
            holder = (ViewHolder) row.getTag();
        }

            // 6
        holder.courseSelectedCheckBox.setTag(position);
        holder.courseSelectedCheckBox.setChecked(courseDisplay.getCourseSelected());

        return row;
    }

    private static final class ViewHolder {
        public TextView courseCodeTextView;
        public TextView courseNameTextView;
        public CheckBox courseSelectedCheckBox;
    }

    CourseDisplay getCourse(int position) {
        return ((CourseDisplay) getItem(position));
    }

    List<CourseDisplay> getBox() {
        List<CourseDisplay> box = new ArrayList<CourseDisplay>();
        for (CourseDisplay p : mDataSource) {
            if (p.getCourseSelected())
                box.add(p);
        }
        return box;
    }

}//end class
 

Вот мой код отображения курса:

     package com.example.android.shustudenthelper;

import static android.R.attr.checked;   

public class CourseDisplay{
    private String courseCode;
    private String courseName;
    private boolean courseSelected;

    public CourseDisplay(String courseCode, String courseName, boolean courseSelected) {
        this.courseCode = courseCode;
        this.courseName = courseName;
        this.courseSelected = courseSelected;
    }

    public String getCourseCode() {
        return courseCode;
    }

    public String getCourseName() {
        return courseName;
    }

    public boolean getCourseSelected(){
        return courseSelected;
    }   

}//end class
 

Вот мой метод базы данных, который получает данные из базы данных:

 public List<CourseDisplay> getAllCoursesForRegistration() {
    List<CourseDisplay> courses = new ArrayList<>();
    openDataBase();
    Cursor mCursor = database.query(TABLE_COURSES, new String[] {COLUMN_COURSE_CODE,COLUMN_COURSE_NAME,COLUMN_COURSE_SELECTED,COLUMN_COURSE_SELECTED }, null, null, null, null, null);
    if(mCursor.moveToFirst()){
        do{
            String courseCode = mCursor.getString(0);
            String courseName = mCursor.getString(1);
            boolean courseSelected = Boolean.parseBoolean(mCursor.getString(2));
            courses.add(new CourseDisplay(courseCode, courseName,courseSelected));
        }while(mCursor.moveToNext());
    }
    mCursor.close();
    close();//close Database
    return courses;
}//end method
 

Вот моя основная деятельность:

     public class CourseSelectionActivity extends AppCompatActivity {
    public static Button confirm_Button;

    public List<String> labels;
    private static CheckBox saveCourseCheckBox;
    public int checkAccumulator = 0;
    private ListView myListView;
    CourseSelectionAdapter newAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_course_selection);

        DatabaseOpenHelper myDbHelper = new DatabaseOpenHelper(this);

        try {
            // check if database exists in app path, if not copy it from assets
            myDbHelper.create();
        } catch (IOException ioe) {
            throw new Error("Unable to create database");
        }

        try {
            // open the database
            myDbHelper.openDataBase();
            myDbHelper.getWritableDatabase();
        } catch (SQLException sqle) {
            throw sqle;
        }

        //Display in ListView
        populateListView();
        // close the database
        myDbHelper.close();

        onClickConfirmButtonListener();

    }//end OnCreate

    private void populateListView(){

        DatabaseOpenHelper myDbHelper = new DatabaseOpenHelper(this);//New Object of Database


        List<CourseDisplay> courseDisplay_data = new ArrayList<CourseDisplay>();

        courseDisplay_data = myDbHelper.getAllCoursesForRegistration();

        newAdapter = new CourseSelectionAdapter(this,R.layout.custom_listview_layout,courseDisplay_data);

        myListView = (ListView)findViewById(R.id.listview_courses);
        myListView.setChoiceMode(2);
        myListView.setAdapter(newAdapter);

        }

    public void onClickConfirmButtonListener() {

        confirm_Button = (Button) findViewById(R.id.course_register_button);

        confirm_Button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (!(checkBoxCounter < 1) amp;amp; checkBoxCounter <= 4) {
                    showResult();//Show the courses selected.
                Toast.makeText(CourseSelectionActivity.this, "You are directed to Notifications", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent("com.example.android.shustudenthelper.NotificationSetupActivity");
                startActivity(intent);}
                else if (checkBoxCounter > 4){
                    Toast.makeText(CourseSelectionActivity.this, "You cannot select more than 4 courses", Toast.LENGTH_SHORT).show();
                }else if (checkBoxCounter < 1){
                    Toast.makeText(CourseSelectionActivity.this, "You need to select at least one course", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    public void showResult() {
        String result = "Selected Courses are :";

        for (CourseDisplay p : newAdapter.getBox()) {
            if (p.getCourseSelected()){
                result  = "n"   p.getCourseName();

            }
        }
        Toast.makeText(this, result "n",Toast.LENGTH_LONG).show();
    }


}//end class
 

Пожалуйста, проведите меня через это.

Ответ №1:

Во-первых, добавьте метод setter в класс CourseDisplay

 public boolean setCourseSelected(boolean value){
    this.courseSelected = value;
}
 

В классе CourseSelectionAdapter, когда установлен флажок, установите значение флажка с помощью описанного выше метода

 holder.courseSelectedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        if (isChecked){
            checkBoxCounter  ;
            courseDisplay.setCourseSelected(isChecked);

        }else {
            checkBoxCounter--;
        }
        System.out.println("Count is: "  checkBoxCounter);
    }
});
 

Наконец, измените showResult() следующим образом

 public void showResult() {
    String result = "Selected Courses are :";

    for (CourseDisplay p : courseDisplay_data) {
        if (p.getCourseSelected()){
            result  = "n"   p.getCourseName();
        }
    }
    Toast.makeText(this, result "n",Toast.LENGTH_LONG).show();
}
 

Комментарии:

1. Я внес это изменение. Спасибо за это. Но это не решает мою реальную проблему. Я считаю, что это должно что-то делать с методом showResult(), где я отображаю выбранные курсы в toast.

2. можете ли вы проверить, что эта строка вернет newAdapter.getBox().size(); чтобы узнать, получаете ли вы какие-либо данные обратно.

3. Рад, что вы спросили меня об этом. Когда я тестировал it..it возвращает 0. Так это как-то связано с методом getBox()?

4. Да, если он возвращает 0, то ваш список пуст, в нем нет объекта CourseDisplay, поэтому вы не можете отобразить какие-либо данные в тосте.

5. Не могли бы вы указать мне, где я ошибся в получении объекта CourseDisplay в методе getBox() .. может быть, что-то не так в коде..