【问题标题】:Passing List from 1st activity to 3rd activity从第一个活动到第三个活动的传递列表
【发布时间】:2016-06-17 23:05:15
【问题描述】:

我有一个启动屏幕活动(ACTIVITY A),它在加载完成时打开ACTIVITY B

活动 B ** 包含一个打开 **活动 C 的按钮

ACTIVITY A使用异步任务加载列表

我希望这个加载的列表在打开时显示在ACTIVITY C

我已经阅读了很多关于如何将值从第一个活动传递到第三个活动的帖子,并尝试实现所有这些但没有任何帮助

甚至尝试通过 ACTIVITY A > ACTÌVITY B > ACTIVITY C 的意图传递列表对象,但没有成功

最后,我使用“jacksons library”将加载的列表转换为jsonstring,然后将其放入ACTIVITY A中的sharedpreferences中,然后从sharedpreferences中检索jsonstring,将其转换回**中的列表对象活动 C** 并显示列表

但是列表没有显示出来

怎么办,有没有更好的流程

飞溅活动(活动 A)

public class SplashActivity extends Activity{

    List<ParseObject> ob;
    List<CodeList> codelist = null;
    ObjectMapper mapper;
    SearchPreferences searchpref;

    @Override
    public void onCreate(Bundle savedInstanceState){
        // TODO: Implement this method
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        mapper = new ObjectMapper();
        searchpref = new SearchPreferences();

        new DataTask().execute();
    }

    public class DataTask extends AsyncTask<Void, Void, List<CodeList>>{
        @Override
        protected List<CodeList> doInBackground(Void[] p1){    
            codelist = new ArrayList<CodeList>();
            try {
                ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("InterActivity");

                query.orderByAscending("_created_at");

                ob = query.find();
                for (ParseObject inter : ob) {
                    CodeList map = new CodeList();
                    map.setIntroduction((String) inter.get("intro"));
                    codelist.add(map);
                }
                return codelist;
            } 
            catch (ParseException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(List<CodeList> result){
            try{
                String jsonsearchlist = mapper.writeValueAsString(result);
                Intent i = new Intent(SplashActivity.this, MainActivity.class);

                searchpref.save(SplashActivity.this, jsonsearchlist);

                startActivity(i);
            }
            catch (JsonProcessingException e){}
        }
    }
}

活动 C

public class SearchActivity extends Activity{

    protected  EditText searchedittext;
    ImageButton searchButton;
    List<ParseObject> ob;
    List<CodeList> splashcodes;
    FinalAdapter fnladapter;

    SearchPreferences searchpref;
    ObjectMapper mapper;

    @Override
    public void onCreate(Bundle savedInstanceState){

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

        searchpref = new SearchPreferences();
        mapper = new ObjectMapper();

        String jsonsearchobj = searchpref.getValue(SearchActivity.this);

        try{
             splashcodes = (List<CodeList>) mapper.readValue(jsonsearchobj, CodeList.class);

            final ListView searchedlist = (ListView) findViewById(R.id.searchlist);
            fnladapter = new FinalAdapter(SearchActivity.this, splashcodes);
            searchedlist.setAdapter(fnladapter);
        }
        catch (IOException e){}
    }
}

【问题讨论】:

  • 你想要什么?我不明白。
  • @ArpitPatel 我希望 Activity A 中的加载列表显示在 Activity C 中
  • @ArpitPatel 和 Activity A 直接打开 Activity B 而不是 Activity C
  • > “甚至尝试通过来自 ACTIVITY A > ACTÌVITY B > ACTIVITY C 的意图传递列表对象,但没有成功。”这是正确的方法。你遇到了什么问题?

标签: android listview object android-sharedpreferences


【解决方案1】:

创建一个全局类并将该列表放入该类中。填写完列表后,在活动 C 中访问列表数据。

【讨论】:

  • 你甚至在我的脑海中想到了这个过程,但不明白我遵循的方法有什么问题
  • 创建一个全局类很简单,如下; public class Globals extends Application { //yourlist } //在menifest文件中添加 android:name=".Globals" 访问列表如下;全局 g = (全局) getApplication; g.yourlist。
  • 是的,我必须尝试一下,我会告诉你的,thnx
  • 我使用的另一种方法是使您的类可序列化并按 Activity B->Activity C 的顺序传递它。
【解决方案2】:

您走在正确的道路上:通过第二个活动循环您的信息。请注意,CodeList 必须是可序列化的。

public class SplashActivity extends Activity{
 ...
 protected void onPostExecute(ArrayList<CodeList> result){
   Intent intent = new Intent(SplashActivity.this, SoCalledBActivity.class);
   intent.putExtra("YOUR_UNIQUE_KEY",result);
   this.startActivity(intent);
 }
}

public class SoCalledBActivity extends Activity{
 ...
 Button trigger = (Button) findViewById(R.id.trigger);
    trigger.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
          //get result list
          ArrayList<CodeList> result = (ArrayList<CodeList>) this.getIntent().getExtras().get("YOUR_UNIQUE_KEY");
          Intent intent = new Intent(SoCalledBActivity.this, SearchActivity .class);
          //add list for C activity
          intent.putExtra("YOUR_UNIQUE_KEY",result);
          this.startActivity(intent);
        }
    });

public class SearchActivity extends Activity{
  ...
  public void onCreate(Bundle savedInstanceState){
   //extract list
   ArrayList<CodeList> result = (ArrayList<CodeList>) this.getIntent().getExtras().get("YOUR_UNIQUE_KEY");
   //do whatever you want with your list...
  }
...
}

【讨论】:

  • Thnx,我会尽力让你知道
  • 如果我把intent.putExtra("YOUR_UNIQUE_KEY",result); ,它给我一个错误,说没有适用的方法 (java.lang.string, java.util.list ,,所以我像这样转换它 i.putExtra("MYLIST", (Serializable)result); 是没关系
  • 是的,你是对的 - 它必须是可序列化的,所以你不能使用 ...但是例如ArrayList 应该可以工作。当然,CodeList 必须实现 Serializable 接口...
  • thnx 兄弟,它可以工作,但我在活动 b 中的演员表下方有一条黄线,它说,演员表是不安全的,因为它不可能在运行时检查 java 类型的实例, lang.object S OF TYPE java.util.list
  • 是的,这很正常。添加一个@SuppressWarnings("unchecked")... 如果您有兴趣,这里描述了整个行为:stackoverflow.com/questions/509076/…stackoverflow.com/questions/14642985/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2012-12-08
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2021-05-14
相关资源
最近更新 更多