【问题标题】:Update ListFragment in Tab Layout when Activity finishesActivity 完成时更新选项卡布局中的 ListFragment
【发布时间】:2015-11-09 16:14:04
【问题描述】:

在我的应用程序中,我有一个选项卡布局(总共 4 个),每个选项卡都包含一个由 ViewPagerAdapter 管理的 ListFragment,我想要做的是在活动时更新其中一个 ListFragment 的内容(使用操作栏)完成,并可能将焦点设置在右侧选项卡上。

我已经搜索了一个解决方案,我找到了这个:update ListFragment when Activity finishes,但似乎不适用于我的情况。

在我使用的 MainActivity 中启动活动(用于添加用户以显示在列表中的活动):

Intent intent = new Intent(this, CreateUser.class);
startActivityForResult(intent, 101);

在我设置的 CreateUser 活动结束时:

setResult(Activity.RESULT_OK);
finish();

在 ListFragment 类中:

@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();
    }
}

但是当活动结束时,什么也没有发生,因为 onActivityResult 永远不会被调用。我该怎么办?

编辑:添加类以获得最佳理解

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 类)

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();
    }
}

【问题讨论】:

    标签: android android-activity android-listfragment


    【解决方案1】:

    我认为你可以使用观察者模式。例如:

    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();
         }
      }
    }
    

    【讨论】:

    • 好的,如果我理解得很好,在 CreateUser 类中,我将一个用户添加到数据库中(在 ListFragment 中显示)我需要扩展 Observable 并在我需要的 ListFragment 类中实现观察者,所以我可以观察 CreateUser 类的变化并调用更新方法,对吗?问题是我已经在 CreateUser 中扩展了 AppCompatActivity,所以我不能调用 setChanged() 和 notifyObservers()..
    • 我想我们也可以实现它。好吧,如您所知,我们的 ListFragment 类将覆盖 function updateFragmentList(Data newData) { add newData to arraylist;通知数据更改;}。此外,您的类 CreateUser 将遍历其观察者列表并调用 ob.updateFragmentList(newData)。希望对你有用。
    • 查看我编辑的帖子,我添加了类以获得最佳理解。如果我从 CreateUser 类调用 updateFragmentList(),则该方法必须是静态的,在这种情况下,我无法获取适配器来更新视图。对不起,但我是 android 编程的新手,所以我不是很好.. 你能给我一个基于我的类的例子吗?谢谢@duynt。
    • 你可以看看这个演示项目github.com/nguyentrungduy/Observer-pattern。然而再想一想,在我看来,你应该在其 onResume() 函数中阅读数据库并更新 ListFragment。这对结构更好。
    【解决方案2】:

    我终于明白了(没有 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多