简体   繁体   中英

notifyDataSetChanged() doesn't update view called in onActivityResult in fragment

I insert data in my RecyclerView which is in fragment using onActivityResult() , but notifyDataSetChanged() doesn't update RecyclerView. I did some search around, but I couldn't find decision for me.

Only if I go back and reopen the app - the new data is shown.

What can I do to update my view?

Here is my RecyclerViewFragment code:

public class RecyclerViewFragment extends Fragment{

    View v;
    private RecyclerView recyclerView;
    private List<Deadline> deadlines;
    DeadlineAdapter deadlineAdapter;

    DbActivity db;
    Cursor fullData;
    LinearLayout empty;

    String summary, date, time;

    public RecyclerViewFragment() { // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        v = inflater.inflate(R.layout.fragment_recycler_view, container, false);
        recyclerView = v.findViewById(R.id.recycler_view);
        empty = v.findViewById(R.id.empty);

        db = new DbActivity(getContext());
        fullData = db.getAllData();
        if (fullData.getCount() > 0){
            if (fullData.moveToFirst()) {
                deadlines = new ArrayList<>();
                int i = 1;
                do {
                    String check = fullData.getString(4);
                    if (!check.startsWith("co")){
                        summary = fullData.getString(1);
                        date = fullData.getString(2);
                        time = fullData.getString(3);
                        String deadline = fullData.getString(4);
                        String labels = fullData.getString(5);
                        //String labels = "wtf";
                        deadlines.add(new Deadline(summary, date, time, deadline,
                                labels));
                        i++;
                    }
                } while (fullData.moveToNext());
            }
            empty.setVisibility(View.GONE);
        }
        else {
            deadlines = new ArrayList<>();
            recyclerView.setVisibility(View.GONE);
            empty.setVisibility(View.VISIBLE);
        }
        deadlineAdapter = new DeadlineAdapter(getContext(), deadlines);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(deadlineAdapter);
        return v;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onActivityResult (int requestCode, int resultCode, Intent data) {
        if (requestCode == Codes.INTENT_RESULT_CODE){
            if(resultCode == Codes.INTENT_RESULT_CODE) {
                DbActivity db = new DbActivity(getContext());
                Cursor newDeadline = db.getAllData();
                newDeadline.moveToLast();
                summary = newDeadline.getString(1);
                date = newDeadline.getString(2);
                time = newDeadline.getString(3);
                String deadline = newDeadline.getString(4);
                String labels = newDeadline.getString(5);
                deadlines.add(new Deadline(summary, date, time, deadline, labels));
                deadlineAdapter.notifyDataSetChanged();
                super.onActivityResult(requestCode, resultCode, data);
            }
        }
    }
}

AddTaskActivity class :

public class AddTaskActivity extends AppCompatActivity {

int minute, hour, year, month, day, check;
String format, summary, date, time;
TextView setDate, setTime;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_task);

    Toolbar toolbar = findViewById(R.id.toolbar_add_task_activity);
    toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_back));
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });

    final EditText editText = findViewById(R.id.summary);

    CharCountTextView charCountTextView = findViewById(R.id.tvTextCounter);
    charCountTextView.setEditText(editText);
    charCountTextView.setCharCountChangedListener(new CharCountTextView.CharCountChangedListener() {
        @Override
        public void onCountChanged(int countRemaining, boolean hasExceededLimit) {
            //stop?
        }
    });

    check = 0;
    setDate = findViewById(R.id.setDate);

    final Calendar currentDate = Calendar.getInstance();
    year = currentDate.get(Calendar.YEAR);
    month = currentDate.get(Calendar.MONTH) + 1;
    day = currentDate.get(Calendar.DAY_OF_MONTH);
    setDate.setText(day + "/" + month + "/" + year);
    month -= 1;
    currentDate.set(Calendar.DAY_OF_MONTH, day);

    setDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DatePickerDialog datePickerDialog = new DatePickerDialog(AddTaskActivity.this, new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                    monthOfYear += 1;
                    setDate.setText(dayOfMonth + "/" + monthOfYear + "/" + year);
                }
            }, year, month, day);
            datePickerDialog.getDatePicker().setMinDate(currentDate.getTimeInMillis() - 1000);
            datePickerDialog.show();
        }
    });


    setTime = findViewById(R.id.setTime);

    Calendar currentTime = Calendar.getInstance();
    hour = currentTime.get(Calendar.HOUR_OF_DAY);
    minute = currentTime.get(Calendar.MINUTE);
    hour = selectedTimeFormat(hour);
    setTime.setText(hour + " : " + minute + " " + format);

    setTime.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            TimePickerDialog timePickerDialog = new TimePickerDialog(AddTaskActivity.this, new TimePickerDialog.OnTimeSetListener() {
                @Override
                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                    hourOfDay = selectedTimeFormat(hourOfDay);
                    setTime.setText(hourOfDay + " : " + minute + " " + format);
                }
            }, hour, minute, false);
            timePickerDialog.show();
        }
    });
}

public int selectedTimeFormat(int hour){
    if (hour == 0){
        format = "AM";
    } else if (hour >= 12){
        hour -= 12;
        format = "PM";
    } else {
        format = "AM";
    }
    return hour;
}

public int codeToReturn(){
    EditText editTextSummary = findViewById(R.id.summary);
    summary = editTextSummary.getText().toString();

    TextView textViewDate = findViewById(R.id.setDate);
    date = textViewDate.getText().toString();

    TextView textViewTime = findViewById(R.id.setTime);
    time = textViewTime.getText().toString();

    boolean check = isDateCorrect(date, time);
    if (!check){
        return 3;
    }
    if (TextUtils.isEmpty(summary.trim())) {
        return 2;
    } else return 1;
}

public boolean isDateCorrect (String date, String time){
    String format = date + " " + time;
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy hh : mm a");
    Date cal1 = new Date();
    Date cal2 = null;
    try {
        cal2 = df.parse(format);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    long diff = cal2.getTime() - cal1.getTime();
    return (diff > 0);
}

public String getDeadline (String date, String time){
    String format = date + " " + time;
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy hh : mm a");
    Date cal1 = new Date();
    Date cal2 = null;
    try {
        cal2 = df.parse(format);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    long diff = cal2.getTime() - cal1.getTime();

    long diffSeconds = diff/(1000);

    long diffMinutes = diff / (60 * 1000);

    long diffHours = diff / (60 * 60 * 1000);

    long diffDays = diff / (24 * 60 * 60 * 1000);

    if (diffDays>1 && diffHours > 24){
        return String.valueOf(diffDays) + " days " + String.valueOf(diffHours - (diffDays*24)) + " hrs";
    } else if (diffDays==1 && diffHours > 24) {
        return String.valueOf(diffDays) + " day " + String.valueOf(diffHours - (diffDays*24)) + " hrs";
    }else if (diffHours>=1){
        return String.valueOf(diffHours) + " h";
    } else if (diffSeconds > 0)
        return String.valueOf(diffSeconds) + " s";
    else return String.valueOf(diffMinutes) + " m";
}

public String getTags(List<String> tags){
    String parsedTags = String.valueOf(tags).replace("[", "").replace("]", "");
    return parsedTags;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_add_task, menu);
    return true;
}

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    super.setResult(Codes.INTENT_EMPTY_CODE, intent);
    super.onBackPressed();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()){
        case android.R.id.home:
            finish();
            return true;

        case R.id.doneTask:
            TagsEditText tagsEditText = findViewById(R.id.labels);
            List<String> tags = tagsEditText.getTags();

            Codes.INTENT_RESULT_CODE = codeToReturn();
            if (Codes.INTENT_RESULT_CODE == 1){
                String deadline = getDeadline(date, time);
                String tagstostring = getTags(tags);
                DbActivity db = new DbActivity(this);
                boolean isInserted = db.insertData(summary, date, time, deadline, tagstostring, "list");
                if (isInserted)
                    //
                     ;
                super.setResult(Codes.INTENT_RESULT_CODE);
                finish();
            } else if (Codes.INTENT_RESULT_CODE == 2) {
                Toast.makeText(this, "You did not enter a summary", Toast.LENGTH_SHORT).show();
            } else if (Codes.INTENT_RESULT_CODE == 3) {
                Toast.makeText(this, "Invalid date", Toast.LENGTH_SHORT).show();
            }
    }
    return super.onOptionsItemSelected(item);
}

}

Hope for any help.

Might be wrong here but in the case where you run onCreate() without data in the db, you are setting

recyclerView.setVisibility(View.GONE);

but you never call

recyclerView.setVisibility(View.VISIBLE);

in onActivityResult() after adding the item, hence the update will not be visible until you restart the app and there's an item in the db when onCreate is called.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM