返回片段时重新加载ListView



我的应用程序有一个主活动,它是一个带有TabHost的FragmentActivity。第一个选项卡有一个带有列表视图的片段,其中填充了Parse中的对象。从列表中选择项目后,将加载一个新活动,其中包含该项目的详细信息,用户可以将该项目标记为已完成。当他们通过点击后退按钮返回到列表视图时,我希望重新加载数据。我该怎么做?

主要活动:

public class MainActivity extends FragmentActivity {
    private FragmentTabHost mTabHost;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
        mTabHost.addTab(mTabHost.newTabSpec("Unassigned").setIndicator("", getResources().getDrawable(R.drawable.unassigned)), UnassignedJobsFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("Assigned").setIndicator("", getResources().getDrawable(R.drawable.assigned)), AssignedJobsFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("Completed").setIndicator("", getResources().getDrawable(R.drawable.completed)), CompletedJobsFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("My Jobs").setIndicator("", getResources().getDrawable(R.drawable.myjobs)), MyJobsFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("Users").setIndicator("", getResources().getDrawable(R.drawable.users)), Users.class, null);
    }
}

列表片段:

public class UnassignedJobsFragment extends Fragment {
    private ImageButton mAddJobButton;
    ProgressBar mUnassignedProgress;
    ListView listView;
    List<ParseObject> object;
    List<String> objectIds;
    ArrayAdapter<String> adapter;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_unassigned, container, false);
        mAddJobButton = (ImageButton)v.findViewById(R.id.addJobButton);
        mUnassignedProgress = (ProgressBar)v.findViewById(R.id.unassignedProgress);
        listView = (ListView)v.findViewById(R.id.unassignedList);
        adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), R.layout.job_list_item);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ParseObject selectedObject = object.get(position);
                String objectId = objectIds.get(position);
                String jobTitle = selectedObject.getString("job");
                String worker = selectedObject.getString("worker");
                String details = selectedObject.getString("details");
                Date jobDate = selectedObject.getDate("date");
                SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy hh:mm");
                String dateString = dateFormat.format(jobDate);
                Boolean accessedFromMyJobs = false;
                Intent intent = new Intent(getActivity(), DetailActivity.class);
                intent.putExtra("OBJECT_ID", objectId);
                intent.putExtra("JOB_TITLE", jobTitle);
                intent.putExtra("WORKER", worker);
                intent.putExtra("DETAILS", details);
                intent.putExtra("DATE", dateString);
                intent.putExtra("FROM_MY_JOBS", accessedFromMyJobs);
                startActivity(intent);
            }
        });
        ParseUser currentUser = ParseUser.getCurrentUser();
        String fullName = currentUser.get("Name").toString();
        if (fullName.equals("Cory Pollard") || fullName.equals("Richie Ray")) {
            mAddJobButton.setVisibility(View.VISIBLE);
        }
        else {
            mAddJobButton.setVisibility(View.GONE);
        }
        getJobs();
        return v;
    }
    public void getJobs() {
        mUnassignedProgress.setVisibility(View.VISIBLE);
        ParseQuery<ParseObject> query = ParseQuery.getQuery("Jobs");
        query.setLimit(1000);
        query.whereEqualTo("assigned", "no");
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> parseObjects, ParseException e) {
                if (e == null) {
                    object = new ArrayList<ParseObject>();
                    objectIds = new ArrayList<String>();
                    mUnassignedProgress.setVisibility(View.GONE);
                    for (ParseObject job : parseObjects) {
                        object.add(job);
                        objectIds.add(job.getObjectId().toString());
                    }
                    for (ParseObject job : object) {
                        adapter.add((String) job.getString("job"));
                    }
                    adapter.notifyDataSetChanged();
                }
                else {
                    mUnassignedProgress.setVisibility(View.GONE);
                    String exception = e.getMessage().toString();
                    Toast.makeText(getActivity().getApplicationContext(), exception, Toast.LENGTH_LONG);
                }
            }
        });
    }
}

实现onSaveInstanceState并保存任何或所有需要恢复的对象,然后您可以将这些对象放回oncreate中,在您的情况下是oncreateview。

这是一个如何做到的例子,

@Override
  protected void onSaveInstanceState(Bundle bundle) 
  {
    super.onSaveInstanceState(bundle);
    bundle.putStringArrayList("My List" , listArray);
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
  if(savedInstanceState!=null)
  {
    listArray = savedInstanceState.getStringArrayList("My List");
  }

我按照@krishna的建议使用onResume()解决了这个问题。我在这里设置了适配器,而不是在onCreate()中。

public void onResume() {
        super.onResume();
        object = null;
        objectIds = null;
        adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), R.layout.job_list_item);
        listView.setAdapter(adapter);
        getJobs();
    }

SharedPreferences是最好的实现。

在第二次活动中

//after entry has been successfully made 
SharedPreferences sharedpref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()):
SharedPreferences.Editor editor = SharedPreferences. edit();
editor. putBoolean("refresh_fragment_listview", true); 
editor. commit();

片段内

@Override
public void onResume() {
    super.onResume();
    SharedPreferences sharedpref = PreferenceManager.getDefaultSharedPreferences(getActivity()):
    String refreshValue sharedpref.getBoolean("refresh_fragment_listview", false) :
    if (refreshValue.equals("true") {
        //reset the value to false to prevent refresh each time
        //fragment is resumed
        SharedPreferences.Editor editor = SharedPreferences. edit();
        editor. putBoolean("refresh_fragment_listview", true); 
        editor. commit();
        //add methods to refresh the listview below
    }
}

最新更新