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,虽然我有这个想法!!