刷新另一个片段的Lis​​tview

时间:2016-03-28 06:29:18

标签: android listview android-fragments android-viewpager

我正在使用带有2个滑动标签布局的viewpager。在第一个tablayout中,我将数据发布到服务器,当我切换选项卡时Listview不更新。只有当我单击Listview项并关闭它时,Listview才会刷新并且发布的数据是可见的... 问题是:当数据发布到服务器时如何自动刷新Listview可以请一些人帮忙。

public class PagerAdapter extends FragmentStatePagerAdapter {
int numOfTabs;
public PagerAdapter(FragmentManager fm,int numOfTabs) {
    super(fm);
    this.numOfTabs=numOfTabs;
}

@Override
public Fragment getItem(int position) {
    switch (position){
        case 0:
            RaiseComplaintFragment RFragment=new RaiseComplaintFragment();
            return RFragment;
        case 1:
            ComplaintListFragment CFragment=new ComplaintListFragment();
            return CFragment;
        default:
            return null;
    }
}

@Override
public int getCount() {
    return numOfTabs;
}

}

这是将数据发布到服务器的方法

 public void postDataToServer(String complaintdata) throws JSONException {
    String url = URLMap.getPostComplaintUrl();

    String roleId = LoggedInUserStore.getLoggedInRoleId(getContext());
    String branchId = LoggedInUserStore.getLoggedInBranchId(getContext());
    String compid = LoggedInUserStore.getLoggedInCompanyId(getContext());

    HashMap<String, String> params = new HashMap<>();
    params.put("CallRecordID", "0"); //pass 0 if we are inserting a new record always
    params.put("CompanyID", compid);
    params.put("BranchID", branchId);
    params.put("ServiceID", sId);
    params.put("CallLocationID", lId);
    params.put("RaisedByID", roleId);
    params.put("ComplaintDetails", complaintdata);
    params.put("CallStatusID", "1");
    pDialog = new ProgressDialog(getContext());
    pDialog.setMessage("Please wait..");
    pDialog.setProgressStyle(pDialog.STYLE_SPINNER);
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    pDialog.show();
    JsonObjectRequest req = new JsonObjectRequest(url, new JSONObject(params), new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {

            AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
            builder.setTitle("Complaint has been registered successfully");
            builder.setMessage("").setCancelable(true);
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
            _complaintText.setText("");
            serviceSpinner.setSelection(0);
            locationSpinner.setSelection(0);
            pDialog.dismiss();
            /*((HomeActivity)getActivity()).getViewPager().setCurrentItem(1);  //onCLick of Submit it just switches the tab
            String tagName="android:switcher:"+R.id.pager+":"+1;
            ComplaintListFragment f2=(ComplaintListFragment)getActivity().getSupportFragmentManager().findFragmentByTag(tagName);
            f2.fetchComplaintData();*/
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
            builder.setTitle("Unable to register your request.\nPlease try later.");
            builder.setCancelable(true);
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
            pDialog.dismiss();
        }
    });
    req.setRetryPolicy(new VolleyRetryPolicy().getRetryPolicy());
    RequestQueue requestQueue = ((VolleyRequestQueue) getActivity().getApplication()).getRequestQueue();
    requestQueue.add(req);
}

我的HomeActivity类处理两个标签布局

viewPager = (ViewPager) findViewById(R.id.view_Pager);
    tabLayout = (TabLayout) findViewById(R.id.tab_Layout);


    String roleID = LoggedInUserStore.getLoggedInRoleId(getApplicationContext());
    if (roleID.equals("4")) {

        //RAISE COMPLAINT UI. IF ROLE ID == 4 MANAGER DASHBOARD

        tabLayout.addTab(tabLayout.newTab().setText("Raise Complaint"));
        tabLayout.addTab(tabLayout.newTab().setText("Complaint List"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        final PagerAdapter adapter =
                new com.six30labs.cms.adapters.PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);

        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) {
                viewPager.setCurrentItem(tab.getPosition());
            }

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

            }
        });

包含我的listview的第二个片段

public class ComplaintListFragment extends Fragment {
private ListView complaintListView;
EditText _inputSearch;
ComplaintAdapter compadapter;
private static Parcelable mListViewScrollPos = null;
private RequestQueue mQueue;
ProgressBar progressBar;
String URL;
private View v;
String TAG="Second Fragment";


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
     v = inflater.inflate(R.layout.fragment_complaint_list, container, false);
    complaintListView = (ListView) v.findViewById(R.id.complaintListView);
    _inputSearch = (EditText) v.findViewById(R.id.inputSearchforComplaintListFragment);
    progressBar = (ProgressBar) v.findViewById(R.id.complaintListProgressBar);

    fetchComplaintData();

    _inputSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            try {
                compadapter.getFilter().filter(s.toString());
                compadapter.notifyDataSetChanged();
            }catch (NullPointerException e){
                e.printStackTrace();
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

    if (mListViewScrollPos != null) {
        complaintListView.onRestoreInstanceState(mListViewScrollPos);
    }

    return v;
}

public void fetchComplaintData() {

    progressBar.setVisibility(View.VISIBLE);
     URL = URLMap.getComplaintUrl("complaint_url");
    URL = URL.replace("{id}", LoggedInUserStore.getLoggedInCompanyId(getContext()));


    StringRequest request = new StringRequest(Request.Method.GET,URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            getCompliantList(response);
            progressBar.setVisibility(View.GONE);

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_SHORT).show();

        }
    });
    request.setRetryPolicy(new VolleyRetryPolicy().getRetryPolicy());
    RequestQueue queue=((VolleyRequestQueue)getActivity().getApplication()).getRequestQueue();
    queue.add(request);
   /* RequestQueue requestQueue
   = Volley.newRequestQueue(getContext());
    requestQueue.add(request);*/
}

public void getCompliantList(String response) {

    try {
        List complaint = new ArrayList<>();
        JSONArray jArray = new JSONArray(response);
        for (int i = 0; i < jArray.length(); i++) {

// complaint.add(Complaint.fromJson(jArray.getJSONObject(i)));

            complaint.add(0,Complaint.fromJson(jArray.getJSONObject(i))); //To push the data to the top of the listview.
        }
        compadapter = new ComplaintAdapter(getContext(), complaint);
        complaintListView.setAdapter(compadapter);

    } catch (JSONException e) {
        e.printStackTrace();
    }
}

//Method that will save the position the user when they scroll
//return it when the user comes back to the listView instead of it refreshing the data.
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mListViewScrollPos = complaintListView.onSaveInstanceState();
}

public void onPause() {
    super.onPause();

}

public void onResume() {
    super.onResume();
    fetchComplaintData();
}

2 个答案:

答案 0 :(得分:3)

BroadcastReceiver课程您的列表视图

private BroadcastReceiver updateProfileBroadcast = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //Fire your event
    }
};

onResume()

中注册广播
registerReceiver(updateProfileBroadcast, new IntentFilter("KEY"));

现在点击广播来自片段

    Intent intent = new Intent("KEY");
    getActivity().sendBroadcast(intent);

答案 1 :(得分:0)

作为SID答案的替代方案,您可以使用EventBus。它通过事件驱动的架构工作,能够在组件之间轻松快速地传输信息。

你是如何使用它的:

1)在app gradle中添加项目:compile 'org.greenrobot:eventbus:3.0.0'

2)在片段EventBus中注册onCreate(),您需要更新ListVieweventBus.register(this);。不要忘记在onDestryView()上注销eventBus.unregister(this);

3)将方法添加到ListView片段中,该片段将处理带有列表更新的事件:

@SupressWarning("unused")
@Subscribe
public void onEvent(List<YourListViewData> event) {/* update `ListView` */};

4)当您需要更新ListView时,从activity \ fragment中触发该事件:

EventBus bus = EventBus.getInstance();
eventBus.post(List<YourListViewData> yourData);