Reputation: 810
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
Reputation: 3541
Use Finally block and insert the following code:
lva.notifyDataSetChanged();
Upvotes: 2
Reputation: 2405
Try this
put your
public void onresume()
{
adapter.notifySetDataChanged();
}
Upvotes: 0
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
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
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