Activity 完成后更新选项卡布局中的 ListFragment
Update ListFragment in Tab Layout when Activity finishes
在我的应用程序中,我有一个选项卡布局(总共 4 个),每个选项卡都包含一个由 ViewPagerAdapter 管理的 ListFragment,我想做的是在 activity (使用操作栏中的按钮调用)完成,并可能将焦点设置在右侧选项卡上。
我搜索了一个解决方案并找到了这个:update ListFragment when Activity finishes,但似乎对我的情况不起作用。
在我使用的 MainActivity 中启动 activity(用于添加用户以显示在列表中的那个):
Intent intent = new Intent(this, CreateUser.class);
startActivityForResult(intent, 101);
在 CreateUser 结束时 activity 我设置了:
setResult(Activity.RESULT_OK);
finish();
并且在ListFragment中class:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if ((requestCode == MYACTIVITY_REQUEST_CODE) && (resultCode == Activity.RESULT_OK)){
((BaseAdapter)adapter).notifyDataSetChanged();
}
}
但是当 activity 完成时什么也没有发生,因为永远不会调用 onActivityResult。我该怎么办?
编辑:添加了 class 以便更好地理解
CreateUser.java
public class CreateUser extends AppCompatActivity {
//The user creation process is done inside class ProcessCreateUser
//that extend AsycTask
private class ProcessCreateUser extends AsyncTask<String, String, JSONObject> {
//...
//onPreExecute, doInBackground
//...
@Override
protected void onPostExecute() {
super.onPostExecute();
//db op...
//at this point the db is updated with the new user and close the activity
finish();
}
}
public void onDestroy(){
Tab3.updateFragmentList();
}
}
Tab3.java (ListFragment class)
public class Tab3 extends ListFragment implements Observer
{
//in onActivityCreated(Bundle savedInstanceState) i get the data from the db and set the adapter
@Override
public void update(Observable observable, Object data) {
}
public static void updateFragmentList() {
//problem: i can't get the adapter from a static function
//but this must be static for be called from CreateUser
((BaseAdapter)adapter).notifyDataSetChanged();
}
}
我想你可以使用观察者模式。例如:
public interface Observer {
public void updateFragmentList();
}
public class YourFragment extends Fragment implement Observer {
public void updateFragmentList() {
// You do some magic code here, such as:
// Update your data for each FragmentList
}
}
public class YourActivity extends Activity {
private ArrayList<Observer> observers = new ArrayList<Observer>();
public void onCreate() {
// Here you add all FragmentList to observers
}
public void onDestroy(){
for(Observer ob in observers) {
ob.updateFragmentList();
}
}
}
我终于明白了(没有 Observer),我将 onActivityResult 方法从 ListFragment 移到了 MainActivity,在 ListFragment 中我为所有更新作业添加了一个简单的 public void updateView() 方法的列表,我已经将以下方法添加到 ViewPagerAdapter 中以调用 updateView() 方法:
@Override
public int getItemPosition(Object object) {
if (object instanceof Tab3) {
((Tab3) object).updateView();
}
return super.getItemPosition(object);
}
在我的应用程序中,我有一个选项卡布局(总共 4 个),每个选项卡都包含一个由 ViewPagerAdapter 管理的 ListFragment,我想做的是在 activity (使用操作栏中的按钮调用)完成,并可能将焦点设置在右侧选项卡上。
我搜索了一个解决方案并找到了这个:update ListFragment when Activity finishes,但似乎对我的情况不起作用。
在我使用的 MainActivity 中启动 activity(用于添加用户以显示在列表中的那个):
Intent intent = new Intent(this, CreateUser.class);
startActivityForResult(intent, 101);
在 CreateUser 结束时 activity 我设置了:
setResult(Activity.RESULT_OK);
finish();
并且在ListFragment中class:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if ((requestCode == MYACTIVITY_REQUEST_CODE) && (resultCode == Activity.RESULT_OK)){
((BaseAdapter)adapter).notifyDataSetChanged();
}
}
但是当 activity 完成时什么也没有发生,因为永远不会调用 onActivityResult。我该怎么办?
编辑:添加了 class 以便更好地理解
CreateUser.java
public class CreateUser extends AppCompatActivity {
//The user creation process is done inside class ProcessCreateUser
//that extend AsycTask
private class ProcessCreateUser extends AsyncTask<String, String, JSONObject> {
//...
//onPreExecute, doInBackground
//...
@Override
protected void onPostExecute() {
super.onPostExecute();
//db op...
//at this point the db is updated with the new user and close the activity
finish();
}
}
public void onDestroy(){
Tab3.updateFragmentList();
}
}
Tab3.java (ListFragment class)
public class Tab3 extends ListFragment implements Observer
{
//in onActivityCreated(Bundle savedInstanceState) i get the data from the db and set the adapter
@Override
public void update(Observable observable, Object data) {
}
public static void updateFragmentList() {
//problem: i can't get the adapter from a static function
//but this must be static for be called from CreateUser
((BaseAdapter)adapter).notifyDataSetChanged();
}
}
我想你可以使用观察者模式。例如:
public interface Observer {
public void updateFragmentList();
}
public class YourFragment extends Fragment implement Observer {
public void updateFragmentList() {
// You do some magic code here, such as:
// Update your data for each FragmentList
}
}
public class YourActivity extends Activity {
private ArrayList<Observer> observers = new ArrayList<Observer>();
public void onCreate() {
// Here you add all FragmentList to observers
}
public void onDestroy(){
for(Observer ob in observers) {
ob.updateFragmentList();
}
}
}
我终于明白了(没有 Observer),我将 onActivityResult 方法从 ListFragment 移到了 MainActivity,在 ListFragment 中我为所有更新作业添加了一个简单的 public void updateView() 方法的列表,我已经将以下方法添加到 ViewPagerAdapter 中以调用 updateView() 方法:
@Override
public int getItemPosition(Object object) {
if (object instanceof Tab3) {
((Tab3) object).updateView();
}
return super.getItemPosition(object);
}