Search code examples
androidlistviewrefreshbaseadapternotifydatasetchanged

notifySetDataChanged not working


I have a ListView ,with custom adapter extending BaseAdapter. The list contains some messages, each of which is highlighted when unseen, but after clicking on it I changed the status into seen in SQLite DB and then used notifySetDataChanged, but it is still not refreshing.

This is my list:

public class Exams extends Fragment {
    List<NotificationMessages> messagesList = new ArrayList();
    private ListView lv;
    String[] subject;
    String[] message;
    String[] date;
    String[] seen;
    ListViewAdapter lva;
    Bundle bundle;

    public Exams() {
        // Required empty public constructor
   }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_exams, container, false);
    lv = (ListView) view.findViewById(R.id.examList);
    bundle = getArguments();
    final Dialog showdialog = new Dialog(getActivity());
    DatabaseHandler dh = new DatabaseHandler(getActivity());
    try {
        dh.Open();
        messagesList = dh.getExams(bundle.getInt("studentId", 0));
        subject = new String[messagesList.size()];
        message = new String[messagesList.size()];
        date = new String[messagesList.size()];
        seen = new String[messagesList.size()];
        for (int i = 0; i < messagesList.size(); i++) {
            subject[i] = messagesList.get(i).getSubject().toString();
            message[i] = messagesList.get(i).getMessage().toString();
            date[i] = messagesList.get(i).getDate_scheduled().toString();
            seen[i] = messagesList.get(i).getStatus().toString();
        }
        lva = new ListViewAdapter(getContext(), subject, message, date, seen);
        lv.setAdapter(lva);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                showdialog.setContentView(R.layout.custom_dialog);
                showdialog.setTitle(messagesList.get(position).getSubject());
                //TextView sub = (TextView)showdialog.findViewById(R.id.dialogsubject);
                TextView msg = (TextView) showdialog.findViewById(R.id.dialogmessage);
                TextView dat = (TextView) showdialog.findViewById(R.id.dialogdate);
                TextView tim = (TextView) showdialog.findViewById(R.id.dialogtime);
                //sub.setText(messagesList.get(position).getSubject());
                msg.setText(messagesList.get(position).getMessage());
                tim.setText("Time : " + messagesList.get(position).getDate_scheduled().substring(11));
                dat.setText("Date : " + messagesList.get(position).getDate_scheduled().substring(0, 10));
                showdialog.setCancelable(true);
                showdialog.show();
                DatabaseHandler dsh = new DatabaseHandler(getActivity());
                try {
                    dsh.Open();
                    int seenMsg = dsh.seenMessage(Integer.parseInt(messagesList.get(position).getMessage_recipientID()), bundle.getInt("studentId", 0));
                    Log.d("MessagesExamsSeen", "" + seenMsg);
                } catch (SQLException e) {
                    Log.d("Message not seen", "");
                    e.printStackTrace();
                }
                dsh.close();
                lva.notifyDataSetChanged();

            }
        });
    } catch (SQLException e1) {
        e1.printStackTrace();
        Log.d("Error", " " + e1);
    }
    dh.close();
    return view;
}

And this is my Adapter class :

public class ListViewAdapter extends BaseAdapter {
private Context context;
private String[] subject;
private String[] message;
private String[] date_scheduled;
private String[] seen;
private static LayoutInflater inflater=null;

public ListViewAdapter(Context context, String[] subject, String[] message, String[] date, String[] seen){
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.context = context;
    this.subject = subject;
    this.message = message;
    this.date_scheduled = date;
    this.seen = seen;
}


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

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view =convertView;
    if(convertView==null) {
        view = inflater.inflate(R.layout.custom_listview, null);
    }
    RelativeLayout rl = (RelativeLayout)view.findViewById(R.id.rl);
    TextView sub = (TextView)view.findViewById(R.id.subject);
    TextView msg = (TextView)view.findViewById(R.id.message);
    TextView date = (TextView)view.findViewById(R.id.date);
    if(seen[position].equals("seen")){
        rl.setBackgroundColor(Color.TRANSPARENT);
    }
    else if(seen[position].equals("unseen")){
        rl.setBackgroundColor(Color.parseColor("#FFDADADA"));
    }
    // Setting all values in listview
    sub.setText(subject[position]);
    if(message[position].length()>=30){
        msg.setText(message[position].substring(0,30)+"..................");
    }
    else{
        msg.setText(message[position]);
    }
    date.setText(date_scheduled[position].substring(0,10));


    return view;
}

}

Can anyone tell me what I am doing wrong here?


Solution

  • You are updating your DB but you are not fetching the updated values again from the DB. You need to fetch the updated values from you DB and then call notifyDataSetChanged method.

    This would solve the issue you are facing.

    Solution 1

    It should be something like this.

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_exams, container, false);
    lv = (ListView) view.findViewById(R.id.examList);
    bundle = getArguments();
    final Dialog showdialog = new Dialog(getActivity());
    DatabaseHandler dh = new DatabaseHandler(getActivity());
    try {
        getDataFromDB();
        lv.setAdapter(lva);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                showdialog.setContentView(R.layout.custom_dialog);
                showdialog.setTitle(messagesList.get(position).getSubject());
                //TextView sub = (TextView)showdialog.findViewById(R.id.dialogsubject);
                TextView msg = (TextView) showdialog.findViewById(R.id.dialogmessage);
                TextView dat = (TextView) showdialog.findViewById(R.id.dialogdate);
                TextView tim = (TextView) showdialog.findViewById(R.id.dialogtime);
                //sub.setText(messagesList.get(position).getSubject());
                msg.setText(messagesList.get(position).getMessage());
                tim.setText("Time : " + messagesList.get(position).getDate_scheduled().substring(11));
                dat.setText("Date : " + messagesList.get(position).getDate_scheduled().substring(0, 10));
                showdialog.setCancelable(true);
                showdialog.show();
                DatabaseHandler dsh = new DatabaseHandler(getActivity());
                try {
                    dsh.Open();
                    int seenMsg = dsh.seenMessage(Integer.parseInt(messagesList.get(position).getMessage_recipientID()), bundle.getInt("studentId", 0));
                    Log.d("MessagesExamsSeen", "" + seenMsg);
                } catch (SQLException e) {
                    Log.d("Message not seen", "");
                    e.printStackTrace();
                }
                dsh.close();
                getDataFromDB
                lva.notifyDataSetChanged();
    
            }
        });
    } catch (SQLException e1) {
        e1.printStackTrace();
        Log.d("Error", " " + e1);
    }
    dh.close();
    return view;
    }
    
    public void getDataFromDB()
    {
        dh.Open();
        messagesList = dh.getExams(bundle.getInt("studentId", 0));
        subject = new String[messagesList.size()];
        message = new String[messagesList.size()];
        date = new String[messagesList.size()];
        seen = new String[messagesList.size()];
        for (int i = 0; i < messagesList.size(); i++) 
            {
                subject[i] = messagesList.get(i).getSubject().toString();
                message[i] = messagesList.get(i).getMessage().toString();
                date[i] = messagesList.get(i).getDate_scheduled().toString();
                seen[i] = messagesList.get(i).getStatus().toString();
            }
    
        lva = new ListViewAdapter(getContext(), subject, message, date, seen);
    }
    

    Solution 2

    Add

     seen[position] = "1"; // or whatever your new state should be.
    

    before

     lva.notifyDataSetChanged();