【问题标题】:populate listview fragment tab android填充listview片段选项卡android
【发布时间】:2015-08-13 07:26:43
【问题描述】:

我的问题是我的列表视图在加载活动时不显示。

这是我的活动代码:

protected void onCreate(Bundle savedInstanceState) {
...
 TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("A"));
        tabLayout.addTab(tabLayout.newTab().setText("B"));
        tabLayout.addTab(tabLayout.newTab().setText("C"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        getServices();

        final ViewPager viewPager = (ViewPager)       findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter
                (getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        viewPager.addOnPageChangeListener(new        TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
        adapter.notifyDataSetChanged();
  }





   public void getServices(){
    RequestQueue queue;
    queue = Volley.newRequestQueue(this);


    String url = "http://..."

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET,url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    for(int i=0;i<response.length();i++){
                        try{

                            JSONObject jsonObjectService =        response.getJSONObject(i);
                            Service service = new Service(jsonObjectService);
                            serviceList.add(service);
                        }
                        catch(JSONException e){
                            e.printStackTrace();
                        }
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    queue.add(jsonArrayRequest);
}

这里是我的片段:

 @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    v = inflater.inflate(R.layout.fragment_tab_fragment1, container, false);

    activity = (SalonInformationsActivity) getActivity();
    listView = (ListView) v.findViewById(R.id.list_service);
    serviceList = activity.getServiceList();
    adapter = new ServiceListAdapter(activity, serviceList);
    listView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            adapter.notifyDataSetChanged();
        }
    });

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
            ((SalonInformationsActivity)getActivity()).callSalon(v.findFocus());
            //Toast.makeText(getApplicationContext(), salonArrayList.get(position).getTel(), Toast.LENGTH_SHORT).show();
        }
    });
    return v;
}

我是 android 新手,我不知道为什么列表视图不显示。但是,如果我在其他选项卡上单击然后返回到 tabA,则列表视图会显示更新我的列表视图。启动时获取列表视图填充的任何解决方案?

【问题讨论】:

    标签: android android-fragments android-listview android-tabs populate


    【解决方案1】:

    您的网络调用需要时间来返回您添加到 arraylist 的数据,在片段而不是活动中执行该网络调用,一旦添加到 arraylist,在适配器上执行 notifyDataSetChanged()

    在您当前的情况下,在返回 newtwork 数据之前创建片段,因此 arraylist 大小为 0

    而且不需要这个

     activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                adapter.notifyDataSetChanged();
            }
        });
    

    您可以直接拨打adapter.notifyDataSetChanged();

    【讨论】:

    • 你的意思是我应该在我的方法中放置一个 notifyDataSetChanged ?
    • 是的,如果您不想更改代码,则在片段中创建一个公共方法,该方法将执行 adapter.notifyDataSetChanged() 并在网络成功调用中将数据添加到 arraylist 后调用该方法跨度>
    • 我尝试在我的片段 refreshListView() 中添加一个方法,使用 adapter.notifyDataSetChanged() 在我的成功响应中调用它,但我的适配器上有一个错误空对象引用
    • JSONObject jsonObjectService = response.getJSONObject(i);服务服务 = 新服务(jsonObjectService); serviceList.add(服务); TabFragment1 片段 = (TabFragment1) getSupportFragmentManager().findFragmentById(R.id.tab_layout); fragment.refreshListView();
    • public void refreshListView(){ adapter.notifyDataSetChanged(); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多