-1

I have a little question for you. I have an app which displays a list of subjects which could be removed or addedd. During developing I realized that I could add new subject without call notifyDataSetChange, why?

Class (ListSubject) which manage list of subjects:

public static ListView mListView;
private Context mContext;
List<Subject> data;
SubjectAdapter subjectSubjectAdapter;

public ListSubject(Context mContext) {
    this.mContext = mContext;
}

public List<Subject> populateList() {
    DBManager db = new DBManager(mContext);

    data = db.GetSubjects();

    return data;
}

public void DeleteAll(){
    DBManager db = new DBManager(mContext);
    db.ClearTable("TBLSUBJECTS");
    data.clear();
}

public void AddSubject(String name, int frequency){

    DBManager db = new DBManager(mContext);
    Subject subToAdd = db.InsertSubject(name, frequency);
    data.add(subToAdd);
}

public void DeleteSubject(int id){
    DBManager db = new DBManager(mContext);
    db.DeleteSubject(id);
}

}

Class (ListSubjectActivity) which rappresents the activity where is listview:

DBManager db;
Button btnClearSubjectTable;
Button btnAddSub;

Context mContext;
private List<Subject> mListSubject;
private SubjectAdapter subjectAdapter;
private ListView lvSubject;
private ListSubject ls;

public ListSubjectActivity(Context mContext) {
    this.mContext = mContext;
}

public ListSubjectActivity(){}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listview_subject);

    db = new DBManager(this);
    btnClearSubjectTable = (Button) findViewById(R.id.btnClearSubjectTable);
    btnAddSub = (Button) findViewById(R.id.btnAddSubject);
    lvSubject = (ListView)findViewById(R.id.subjectList);
    mListSubject = new ArrayList<>();
    ls = new ListSubject(getApplicationContext());

    mListSubject = ls.populateList();


    btnClearSubjectTable.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           ls.DeleteAll();
             subjectAdapter.notifyDataSetChanged();
        }
    });

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

            final Dialog dialog = new Dialog(ListSubjectActivity.this);
            dialog.setContentView(R.layout.dialog_insert_subject);

            final EditText txtNewSubName = (EditText)  dialog.findViewById(R.id.txtNewSubName);
            final EditText txtFreqNewSub = (EditText) dialog.findViewById(R.id.txtFreqNewSub);


            Button dialogButtonOK = (Button) dialog.findViewById(R.id.btnOK);
            dialogButtonOK.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AddSubject(txtNewSubName.getText().toString(), Integer.parseInt(txtFreqNewSub.getText().toString()));
                    subjectAdapter.notifyDataSetChanged();
                    dialog.dismiss();
                }
            });
            Button dialogButtonCancel = (Button) dialog.findViewById(R.id.btnCancel);
            dialogButtonCancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });

            dialog.show();
            Window window = dialog.getWindow();
            window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, 700);

        }
    });
    subjectAdapter = new SubjectAdapter(getApplicationContext(), mListSubject);
    lvSubject.setAdapter(subjectAdapter);
}

public void AddSubject(String newSub, int frequency)
{
    ls.AddSubject(newSub, frequency);
}

My subject adapter:

private Context mContext;
private List<Subject> mList;
private ListSubject ls;


public SubjectAdapter(Context mContext, List<Subject> mList) {
    this.mContext = mContext;
    this.mList = mList;
}

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

@Override
public Object getItem(int position) {
    return mList.get(position);
}

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

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

    View v = View.inflate(mContext, R.layout.item_subject_list,null);
    TextView txtSubjectName = v.findViewById(R.id.txtName);
    TextView txtFrequency = v.findViewById(R.id.txtFrequency);

    txtSubjectName.setText(mList.get(position).GetSubjectName());
    txtFrequency.setText(Integer.toString(mList.get(position).GetFrequency()));

    ls = new ListSubject(mContext);
    ImageButton btnDeleteSub = (ImageButton) v.findViewById(R.id.btnDeleteSub);
    btnDeleteSub.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ls.DeleteSubject(mList.get(position).GetSubjectID());
            mList.remove(position);
            notifyDataSetChanged(); useless

        }
    });

    return v;
}

}

Keep in mind please, that I'm new in android development so could be make a lot of mistake. Thank you who help me

1 Answers1

0

If your current code is what you're wondering about, you are calling notifyDataSetChanged() when adding an item. It's right here:

        Button dialogButtonOK = (Button) dialog.findViewById(R.id.btnOK);
        dialogButtonOK.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AddSubject(txtNewSubName.getText().toString(), Integer.parseInt(txtFreqNewSub.getText().toString()));
                subjectAdapter.notifyDataSetChanged(); //see?
                dialog.dismiss();
            }
        });
TheWanderer
  • 16,775
  • 6
  • 49
  • 63
  • Yes man, I know, but if I comment that line "subjectAdapter.notifyData.." listview refreshes anyway, so I ask to myself, what is the role of notifyDataSetChange? Because then I don't understand. For example if I add new item and in my code I haven't subjectAdapter.notifyDataSetChanged() I can see anyway the new item on display – Mitikuzzo9 Nov 10 '18 at 12:43