从活动发送ArrayList到片段?

时间:2018-08-13 19:18:48

标签: java android android-fragments arraylist

我是Android的新手,我正在尝试使用捆绑软件和可打包的碎片从数据库发送一些数据,以显示recyclerview和layouttab。使用虚拟数据,我可以在2个选项卡中显示recyclerview。但是,当我尝试使用从活动中获取数据的数据库中的数据时,在发送要分段的数据时遇到了一些麻烦。

我在帖子中尝试了许多具有相似性的解决方案。但是直到现在,我还无法获得正确的解决方案。

这是我的 MainActivity.java

  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/countup.js/1.8.5/countUp.min.js"></script>
  <div id="prg-counter">
  <section id="prg-head">
    <h1>Count-Up Color</h1>
    <hr/>
  </section>
  <div class="prg-container row">
    <div class="col-md-4">
      <h4 class="color_red" id="red"></h4>
      <h4 class="prg-count-title">red
        < 0 </h4>
    </div>
    <div class="col-md-4">
      <h4 class="color_black" id="black"></h4>
      <h4 class="prg-count-title">black = 0</h4>
    </div>
    <div class="col-md-4">
      <h4 class="color_green" id="green"></h4>
      <h4 class="prg-count-title">green > 0 </h4>
    </div>
  </div>
  <hr/>
</div>

}

这也是对象类 Active.java

public class MainActivity extends AppCompatActivity {

private TabLayout tabLayout;
private ViewPager viewPager;
private ViewPagerAdapter adapter;
private static final String URL = "http://myweb.com/api/getID.php?id=1";
private String[] ar_id, ar_stat;
private int arr;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tabLayout = (TabLayout) findViewById(R.id.tablayout_id);
    viewPager = (ViewPager) findViewById(R.id.viewpager_id);
    adapter = new ViewPagerAdapter(getSupportFragmentManager());

    //Add Fragment
    adapter.AddFragment(new FragmentActive(), "Active");
    adapter.AddFragment(new FragmentHistory(), "History");

    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager);

    getDataOrder();

}

private void getDataOrder(){
    final JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
            Request.Method.GET, URL, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray list = response.getJSONArray("result");
                ArrayList<Active> arrayList = new ArrayList<Active>();
                arr = list.length();
                ar_id = new String[arr];
                ar_stat = new String[arr];
                for (int i = 0; i < arr; i++) {
                    JSONObject data = list.getJSONObject(i);
                    ar_id[i] = data.getString("id");
                    ar_stat[i] = data.getString("status");
                    arrayList.add(new Active(ar_id[i], ar_stat[i]));
                }

                Bundle bundle = new Bundle();
                bundle.putParcelableArrayList("ac_array", arrayList);
                bundle.putString("test", "123");
                FragmentActive fragmentActive = new FragmentActive();
                fragmentActive.setArguments(bundle);
            } catch (JSONException e) {

            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("Fetching ERROR", "ERROR");
        }
    }
    );
    Volley.newRequestQueue(this).add(jsonObjectRequest);
}

}

这是片段类 FragmentActive.java

public class Active implements Parcelable {
private String status;

public Active(){

}

public Active(Parcel in){
    super();
    readFromParcel(in);
}

public Active(String id, String status) {
    this.id = id;
    this.status = status;
}

public static final Parcelable.Creator<Active> CREATOR = new Parcelable.Creator<Active>() {
    public Active createFromParcel(Parcel in) {
        return new Active(in);
    }

    public Active[] newArray(int size) {

        return new Active[size];
    }

};

public void readFromParcel(Parcel in){
    id = in.readString();
    status = in.readString();
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(id);
    dest.writeString(status);
}

public String getId() {
    return id;
}

public String getStatus() {
    return status;
}

public void setId(String id) {
    this.id = id;
}

public void setStatus(String status) {
    this.status = status;
}

}

当我运行应用程序时,根本没有任何错误,只是没有显示recyclerview,但是当我在FragmentActive.onCreateView上更改 activeArrayList 时虚拟ArrayList,出现虚拟数据。

然后,我尝试打印从数据库中获得的数据,它显示。但是,当我尝试从MainActivity打印arrayList时,这就是我从运行调试文本中得到的结果

  

D / Debug列表:[com.xxx.xxx.app.Active@79e903c,   com.xxx.xxx.app.Active @ 8dde1c5,com.xxx.xxx.app.Active @ 4a1571a]

     

I / System.out:[com.xxx.xxx.app.Active@79e903c,   com.xxx.xxx.app.Active @ 8dde1c5,com.xxx.xxx.app.Active @ 4a1571a]

它们是数据库中的3行吗?因为我选择的数据库显示3行。我应该怎么做才能获取,发送和显示数据?

4 个答案:

答案 0 :(得分:1)

D /调试列表:[com.xxx.xxx.app.Active @ 79e903c,com.xxx.xxx.app.Active @ 8dde1c5,com.xxx.xxx.app.Active @ 4a1571a],这是您的activeArrayList。 里面的值是列表中的对象。 您可能应该制作一个自定义的回收视图适配器。 您使用的是一个字符串数组列表。 因此,制作一个recyclerviewadapter,并使其可以显示所需数据的方式。

答案 1 :(得分:1)

您创建片段但未将其添加到任何地方,只有在拥有数据后才必须填充ViewPagerAdapter:

            FragmentActive fragmentActive = new FragmentActive();
            fragmentActive.setArguments(bundle);
            adapter.addFragment(fragmentActive//

您添加到ViewPager的另一个为空,如果您不使用同一实例,则为空。

答案 2 :(得分:1)

您需要在片段中有一个方法来更新ArrayList<Active>数据,这将 更新回收者视图的适配器数据。

可能像
片段中:

public void updateListData(ArrayList<Active> list){
recyclerAdapter.updateData(list);
}

您的Recycler适配器中的updateData方法如下:

public void updateData(ArrayList<Active> list){
//assign list to your data in adapter
this.lists = list;
notifyDataSetChanged();
}

在onResponse中获取数据后,在FragmentActive上调用updateListData
将FragmentActive作为类级别变量。

答案 3 :(得分:1)

我通常使用这种应用程序的方法是在活动中填充ArrayList(从数据库),然后Fragment使用界面从活动中提取数据(或片段可见时,将getActivity()的{​​{1}}投射到您的主要活动的类中(请参阅Fragment)。

关于您的代码:

1)我看到您使用setUserVisibleHint()FragmentActive初始化了viewpager,但是那时它们没有参数。

2)在FragmentHistory中为getDataOder()创建参数,并创建该片段的新实例,但似乎丢失了,因为对此没有进行任何操作。

3)另外,请记住,FragmentActive管理着添加到其中的ViewPager的生命周期,因此我认为,如果将参数设置为{{ 1}},因为最有可能的是您创建并设置了参数的实例将在某个时候被删除,并替换为缺少参数的新实例。 (我应该对此进行测试,但这是我相信会发生的事情。)