Android notifySetDataChanged不工作
我有一个Android notifySetDataChanged不工作,android,listview,refresh,baseadapter,notifydatasetchanged,Android,Listview,Refresh,Baseadapter,Notifydatasetchanged,我有一个列表视图,自定义适配器扩展了BaseAdapter。该列表包含一些消息,每个消息在不可见时都会突出显示,但单击后,我将其状态更改为在SQLiteDB中看到,然后使用notifySetDataChanged,但它仍然没有刷新 这是我的清单: public class Exams extends Fragment { List<NotificationMessages> messagesList = new ArrayList(); private ListVie
列表视图
,自定义适配器扩展了BaseAdapter
。该列表包含一些消息,每个消息在不可见时都会突出显示,但单击后,我将其状态更改为在SQLite
DB中看到,然后使用notifySetDataChanged
,但它仍然没有刷新
这是我的清单:
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;
}
}
有人能告诉我我做错了什么吗?您正在更新数据库,但没有再次从数据库获取更新后的值。您需要从数据库中获取更新后的值,然后调用
notifyDataSetChanged
方法
Try this
put your
public void onresume()
{
adapter.notifySetDataChanged();
}
这将解决您面临的问题
解决方案1
应该是这样的
@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);
}
以前
lva.notifyDataSetChanged();
您正在更新数据库,但不会再次从数据库获取更新后的值。您需要从数据库中获取更新后的值,然后调用
notifyDataSetChanged
方法
这将解决您面临的问题
解决方案1
应该是这样的
@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);
}
以前
lva.notifyDataSetChanged();
首先,检查数据库是否已正确更新。
在调用
ListViewAdapter
的getView()
中的notifyDataSetChanged()
方法之后,在返回视图之前代码>首先检查数据库是否已更新或未正确更新。
在调用ListViewAdapter
的getView()
中的notifyDataSetChanged()
方法之后,在返回视图之前
您必须查看适配器的构造函数,它在新实例中复制数组并使用这些新数组,适配器正在使用的新数组没有更新,因此调用notifySetDataChanged
时没有任何更改是完全正常的。您必须查看适配器的构造函数,它复制新实例中的阵列并使用这些新阵列,适配器正在使用的新阵列没有更新,因此在调用notifySetDataChanged
Use Finally block并插入以下代码时,没有任何更改是完全正常的:
lva.notifyDataSetChanged() 使用Finally block并插入以下代码:
lva.notifyDataSetChanged() 我认为这也是问题所在,但我不知道如何在不重新打开片段的情况下更新DB…这就是我在解决方案1中解释的想法:更改状态“SEED”后,需要用更新的数据重新加载适配器,然后调用NotifyDatasetChanged
。我无法运行和测试您的代码。我只是想知道怎么做。你得调试一下。哈哈,我知道,我只是在尝试,嗯,thanx,虽然我有这个想法!!我认为这也是问题所在,但我不知道如何在不重新打开片段的情况下更新DB…这就是我在解决方案1中解释的想法:更改状态“SEED”后,需要用更新的数据重新加载适配器,然后调用NotifyDatasetChanged
。我无法运行和测试您的代码。我只是想知道怎么做。你得调试一下。哈哈,我知道,我只是在尝试,嗯,thanx,虽然我有这个想法!!