notifySetDataChanged 不工作

notifySetDataChanged not working

我有一个 ListView,自定义适配器扩展 BaseAdapter。列表里面有一些消息,每条消息在看不见的时候都高亮显示,但是我点开后把状态改成了seen in 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;
}

这是我的适配器 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;
}

}

谁能告诉我我做错了什么?

 Try this

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

您正在更新数据库,但没有从数据库中再次获取更新后的值。您需要从数据库中获取更新后的值,然后调用 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);
}

解决方案 2

添加

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

之前

 lva.notifyDataSetChanged();

首先你检查你的数据库是否更新正确。 在 return view;.

之前调用 ListViewAdaptergetView() 中的 notifyDataSetChanged() 方法

您必须查看适配器的构造函数,它在新实例中复制数组并使用这些新数组,适配器正在使用的新数组没有更新,因此没有任何变化是完全正常的当你打电话给 notifySetDataChanged.

使用 Finally 块并插入以下代码:

lva.notifyDataSetChanged();