Krazzie KAy
Krazzie KAy

Reputation: 810

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?

Upvotes: 0

Views: 165

Answers (5)

Aman Goel
Aman Goel

Reputation: 3541

Use Finally block and insert the following code:

lva.notifyDataSetChanged();

Upvotes: 2

MurugananthamS
MurugananthamS

Reputation: 2405

 Try this

put your 
public void onresume()
{
adapter.notifySetDataChanged();
}

Upvotes: 0

whd.nsr
whd.nsr

Reputation: 694

You must look at the constructor of your adapter, it copies the arrays in new instances and work with these new arrays, the new arrays which the adapter is using are not updating, so it's totally normal that nothing will be changing when ye call notifySetDataChanged.

Upvotes: 0

Vinit Yadav
Vinit Yadav

Reputation: 291

Firstly you check your Database updated or not properly. After that call notifyDataSetChanged() method in getView() of ListViewAdapter before return view;.

Upvotes: 0

Rohit5k2
Rohit5k2

Reputation: 18112

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();

Upvotes: 0

Related Questions