0

我有一个活动页面,其中有两个片段。在第一个片段中有一个列表视图,其中包含具有 pulltorefresh 功能的主类别列表。

当我单击列表项时,它将显示其第二个片段的子类别。这就是它应该如何工作的全部。

但我的问题是当活动加载第一个片段时显示,并且消息没有互联网连接显示在 Toast 中,但是当我点击它的列表项时,第二个片段没有发生任何事情

代码在这里

这是一个有两个片段的活动页面

public class ServiceActivity extends Activity {

CategoryDetails mainCategory;
SimpleSideDrawer slide_me;
public ImageButton imgBack;
static View fragmentsub;
static View fragmentmain;

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_service);

    fragmentmain = findViewById(R.id.fragmentmain);
    fragmentsub = findViewById(R.id.fragmentsub);
    imgBack = (ImageButton)findViewById(R.id.imgBackBtn);
    imgBack.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            finish();
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_service, menu);
    return true;
}

第一个片段

public class FreagmentMainCategory extends Fragment{

    private LinearLayout llLayoutmain;
    private FragmentActivity faActivitymain;
    private ListView lstCategoryList;
    private SelectCategoryTask mAuthTask = null;
    private View mServiceStatusView;
    CategoryDetails mainCategory;
    private categoryListAdapter adapterList;    
    static final int MENU_MANUAL_REFRESH = 0;
    static final int MENU_DISABLE_SCROLL = 1;
    static final int MENU_SET_MODE = 2;
    static final int MENU_DEMO = 3;
    private View lstListView;
    private PullToRefreshListView mPullRefreshListView;

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

        //faActivitymain  = (FragmentActivity)  super.getActivity();
         View view = inflater.inflate(R.layout.activity_fragment_main,container, false);

        this.getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
        FontUtils.setCustomFont(getActivity().findViewById(R.id.mainView), getActivity().getAssets());

        lstListView= view.findViewById(R.id.lstCategoryView);
        mPullRefreshListView = (PullToRefreshListView)view.findViewById(R.id.lstCategory);
        // Set a listener to be invoked when the list should be refreshed.
        mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
            @Override
            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                String label = DateUtils.formatDateTime(getActivity().getApplicationContext(), System.currentTimeMillis(),
                        DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
                // Update the LastUpdatedLabel
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
                // Do work to refresh the list here.
                new GetDataTask().execute();
            }
        });
        mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
            @Override
            public void onLastItemVisible() {                   
            }
        }); 
        lstListView=(View)view.findViewById(R.id.lstCategoryView);

        lstCategoryList = ((PullToRefreshListView)view.findViewById(R.id.lstCategory)).getRefreshableView();            
        //lstCategoryList = (ListView) inflater.inflate(R.layout.activity_fragment_main, container, false);
        lstCategoryList = mPullRefreshListView.getRefreshableView();            
        registerForContextMenu(lstCategoryList);                        
        mServiceStatusView = view.findViewById(R.id.service_status);
        showProgress(true); 
        mAuthTask = new SelectCategoryTask();
        mAuthTask.execute((Void) null);
        lstCategoryList.setOnItemClickListener(new OnItemClickListener(){
                public void onItemClick(AdapterView<?> parent, View v, int position,long arg3) {    
                    Fragment fragment = new Fragment();
                    Bundle bundle = new Bundle();                                   
                    bundle.putString("MainCategoryName", mainCategory.masterinfo.get(position-1).maincatname);
                    fragment.setArguments(bundle);
            }
        });
        return view;
    }
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getActivity().getMenuInflater().inflate(R.menu.activity_service, menu);
        return true;
    }       
    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
    private void showProgress(final boolean show) {
        // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
        // for very easy animations. If available, use these APIs to fade-in
        // the progress spinner.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
            int shortAnimTime = getResources().getInteger(
                    android.R.integer.config_shortAnimTime);
            mServiceStatusView.setVisibility(View.VISIBLE);
            mServiceStatusView.animate().setDuration(shortAnimTime)
                    .alpha(show ? 1 : 0)
                    .setListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            mServiceStatusView.setVisibility(show ? View.VISIBLE
                                    : View.GONE);
                        }
                    });
            lstListView.setVisibility(View.VISIBLE);
            lstListView.animate().setDuration(shortAnimTime)
                    .alpha(show ? 0 : 1)
                    .setListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            lstCategoryList.setVisibility(show ? View.GONE
                                    : View.VISIBLE);
                        }
                    });         

        } else {
            // The ViewPropertyAnimator APIs are not available, so simply show
            // and hide the relevant UI components.
            mServiceStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
            lstListView.setVisibility(show ? View.GONE : View.VISIBLE);                         
        }
    }       
    public class GetDataTask extends AsyncTask<Void, Void, Boolean> {
        @Override
        protected Boolean doInBackground(Void... params) {
            // Simulates a background job.
            ServerAccess sa=new ServerAccess();
            mainCategory=sa.GetMainCategory();
            return true;
        }
        @Override
        protected void onPostExecute(Boolean result) {
            if(mainCategory==null){
                Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_check_network), Toast.LENGTH_LONG).show();
                lstCategoryList.setAdapter(null);
            }else if(mainCategory.code.equals("MOB01")){
                adapterList=new categoryListAdapter(getActivity().getApplicationContext(), mainCategory.masterinfo);
                lstCategoryList.setAdapter(null);
            }else if(mainCategory.code.equals("MOB02")){                    
                lstCategoryList.setAdapter(null);
            }else{
                Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_genric_error), Toast.LENGTH_LONG).show();
                lstCategoryList.setAdapter(null);
            }
            // Call onRefreshComplete when the list has been refreshed.
            mPullRefreshListView.onRefreshComplete();

            super.onPostExecute(result);
        }
    }

    public class SelectCategoryTask extends AsyncTask<Void, Void, Boolean> {

        @Override
        protected Boolean doInBackground(Void... params) {          
            ServerAccess sa=new ServerAccess();
            mainCategory=sa.GetMainCategory();          
            return true;
        }
        @Override
        protected void onPostExecute(final Boolean success) {
            mAuthTask = null;
            showProgress(false);
            if(mainCategory==null){
                Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_check_network), Toast.LENGTH_LONG).show();
                lstCategoryList.setAdapter(null);
            }else if(mainCategory.code.equals("MOB01")){
                adapterList=new categoryListAdapter(getActivity().getApplicationContext(), mainCategory.masterinfo);
                lstCategoryList.setAdapter(adapterList);
            }else if(mainCategory.code.equals("MOB02")){
                lstCategoryList.setAdapter(null);
            }else{
                Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_genric_error), Toast.LENGTH_LONG).show();
                lstCategoryList.setAdapter(null);
            }           
        }
        @Override
        protected void onCancelled() {
            mAuthTask = null;
            showProgress(false);
        }
    }
    class categoryListAdapter extends BaseAdapter {        
        List<Category> mainItems;
        Context myContext;
        public categoryListAdapter(Context context, List<Category> items) {
            myContext = context;
            mainItems = items;            
        }
        public int getCount() {           
            return mainItems.size();
        }
        public Object getItem(int index) {           
            return mainItems.get(index);
        }
        public long getItemId(int position) { 
            return position;
        }        
        @Override
        public View getView(int position, View convertView, ViewGroup parent    ) {
            // TODO Auto-generated method stub
            RelativeLayout layout = new RelativeLayout(myContext);          
            TextView tv = new TextView(myContext);
            tv.setText(mainItems.get(position).maincatname);
            tv.setGravity(Gravity.LEFT);
            tv.setTextSize(16);
            tv.setPadding(20, 20, 0, 20);
   tv.setTextColor(myContext.getResources().getColor(R.color.BlackColor));
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams
            (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
            layout.addView(tv,lp);           
            return layout;
        }
    }

}

第二个片段

public class FragmentSubCategory extends Fragment{
private View mSubCategoryStatusView;
private subCategoryListAdapter subAdapterList;
private SelectSubCategoryTask mSubAuthTask = null;
private ExpandableListView lstSubCategoryList;
String MainCategoryId="-1",MainCategoryName;
SubCategoryDetails mainSubCategory;
@SuppressLint("NewApi")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {

    this.getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    FontUtils.setCustomFont(getActivity().findViewById(R.id.subfragment), getActivity().getAssets());

    View view = inflater.inflate(R.layout.activity_fragment_sub,container, false);

    lstSubCategoryList = (ExpandableListView)view.findViewById(R.id.lstSubCategory);
    mSubCategoryStatusView = view.findViewById(R.id.sub_category_status);
    Bundle bundle = getArguments();
    try{        
        MainCategoryName = bundle.getString("MainCategoryName");
    }catch(Exception ex){
        MainCategoryName="";
    }   
    try{        
        MainCategoryId = bundle.getString("MainCategoryId");
    }catch(Exception ex){
        MainCategoryId="-1";
    }

    lstSubCategoryList.setOnChildClickListener(new OnChildClickListener() {  
        @Override
        public boolean onChildClick(ExpandableListView parent, View v,
                int groupPosition, int childPosition, long id) {
                Intent vendorListIntent=new Intent(getActivity().getApplication(),VendorListByCategoryActivity.class);
                vendorListIntent.putExtra("typeid", mainSubCategory.masterinfo.get(groupPosition).type.get(childPosition).typeid);
                vendorListIntent.putExtra("subCategoryId", mainSubCategory.masterinfo.get(groupPosition).subcatid);
                vendorListIntent.putExtra("mainCategoryId", MainCategoryId);
                startActivity(vendorListIntent);

            return false;
        }
    });
    showSubCategoryProgress(true);
    mSubAuthTask = new SelectSubCategoryTask();
    mSubAuthTask.execute((Void) null);
    return view;
}
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getActivity().getMenuInflater().inflate(R.menu.activity_sub_category, menu);
    return true;
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
private void showSubCategoryProgress(final boolean show) {
    // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
    // for very easy animations. If available, use these APIs to fade-in
    // the progress spinner.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
        int shortAnimTime = getResources().getInteger(
                android.R.integer.config_shortAnimTime);

        mSubCategoryStatusView.setVisibility(View.VISIBLE);
        mSubCategoryStatusView.animate().setDuration(shortAnimTime)
                .alpha(show ? 1 : 0)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mSubCategoryStatusView.setVisibility(show ? View.VISIBLE
                                : View.GONE);
                    }
                });
        lstSubCategoryList.setVisibility(View.VISIBLE);
        lstSubCategoryList.animate().setDuration(shortAnimTime)
                .alpha(show ? 0 : 1)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        lstSubCategoryList.setVisibility(show ? View.GONE
                                : View.VISIBLE);
                    }
                });         
    } else {
        // The ViewPropertyAnimator APIs are not available, so simply show
        // and hide the relevant UI components.
        mSubCategoryStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
        lstSubCategoryList.setVisibility(show ? View.GONE : View.VISIBLE);          
    }
}   
public class SelectSubCategoryTask extends AsyncTask<Void, Void, Boolean> {     
    @Override
    protected Boolean doInBackground(Void... params) {
        ServerAccess sa=new ServerAccess();
        mainSubCategory=sa.GetTypesMasters(Integer.parseInt(MainCategoryId));           
        return true;
    }
    @Override
    protected void onPostExecute(final Boolean success) {
        mSubAuthTask = null;            
        if(mainSubCategory==null){
            showSubCategoryProgress(false);
            Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_check_network), Toast.LENGTH_LONG).show();                
            //Message no category found.    
        }else if(mainSubCategory.code.equals("MOB02")){
            showSubCategoryProgress(false);
            Toast.makeText(getActivity().getApplicationContext(), mainSubCategory.msg, Toast.LENGTH_LONG).show();
        }else if(mainSubCategory.code.equals("MOB01")){
            showSubCategoryProgress(false);
            subAdapterList=new subCategoryListAdapter(getActivity().getApplicationContext(), mainSubCategory.masterinfo);
            lstSubCategoryList.setAdapter(subAdapterList);
            //set adapter
        }else{
            showSubCategoryProgress(false);
            Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_genric_error), Toast.LENGTH_LONG).show();
            //No Category message
        }
    }
    @Override
    protected void onCancelled() {
        mSubAuthTask = null;
        showSubCategoryProgress(false);
    }
}
public class subCategoryListAdapter extends BaseExpandableListAdapter {      
    private Context myContext;
    private List<SubCategory> _listDataHeader; // header titles
    // child data in format of header title, child title             
    public subCategoryListAdapter(Context context, List<SubCategory> listDataHeader) {
        this.myContext = context;
        this._listDataHeader = listDataHeader;          
    }    
    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataHeader.get(groupPosition).type.get(childPosititon).typename;
    }    
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }    
    @Override
    public View getChildView(int groupPosition, final int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {   
        final String childText = (String) getChild(groupPosition, childPosition);               
        RelativeLayout layout = new RelativeLayout(myContext);  
        TextView txtListChild = new TextView(myContext);
        txtListChild.setText(childText);
        txtListChild.setGravity(Gravity.LEFT);
        txtListChild.setTextSize(16);           
        txtListChild.setPadding(60, 20, 0, 20);
        txtListChild.setTextColor(myContext.getResources().getColor(R.color.BlackColor));
        layout.addView(txtListChild);                 
        return layout;
    }    
    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataHeader.get(groupPosition).type.size();
    }    
    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition).subcatname;
    }    
    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }    
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }    
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);  
        int noOfType= getChildrenCount(groupPosition);
        RelativeLayout layout = new RelativeLayout(myContext);  
        TextView lblListHeader = new TextView(myContext);
        lblListHeader.setText(headerTitle.toUpperCase());
        lblListHeader.setGravity(Gravity.LEFT);         
        lblListHeader.setTextSize(18);
        lblListHeader.setPadding(50, 20, 0, 20);
        lblListHeader.setTextColor(myContext.getResources().getColor(R.color.BlackColor));
        layout.addView(lblListHeader);
        RelativeLayout.LayoutParams noOfTypesLp = new RelativeLayout.LayoutParams
        (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        noOfTypesLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        TextView txtNoOfType = new TextView(myContext);
        txtNoOfType.setText(String.valueOf(noOfType));
        txtNoOfType.setTextSize(16);            
        txtNoOfType.setPadding(0, 20, 20, 20);
        txtNoOfType.setTextColor(myContext.getResources().getColor(R.color.BlackColor));
        layout.addView(txtNoOfType,noOfTypesLp);

        return layout;
    }
    @Override
    public boolean hasStableIds() {
        return false;
    }    
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}

}

4

2 回答 2

1

在您的 OnItemClickListener 中:

Fragment fragment = new Fragment();
Bundle bundle = new Bundle();                                   
bundle.putString("MainCategoryName", mainCategory.masterinfo.get(position-1).maincatname);
fragment.setArguments(bundle);

这不是正确的做法。您需要做的是将数据传输到第二个片段而不是“新片段”。

我认为您可以这样做:1.将数据传输到ServiceActivity;2.用第二个片段替换第一个片段并将setArguments()数据传输到第二个片段。

代码:
1. 创建一个这样的回调:

public interface MainfragmentCallBack{
    public void showData(String data, int id);
}

2.ServiceActivity机具MainfragmentCallBack和超车showData()

3、showData()ServiceActivity

@Override
public void showData(String data, int id){
    //use FragmentTransaction to replace 1st fragment with 2nd fragment
    //use setArgument to transfer data   
    // I do not konw your layout of ServiceActivity,so you can implement it on yourself 
}

4,在第一个片段中实例化MainFragmentCallBack,在OnItemClickListener

建议:
在这种情况下,在另一个活动中显示数据而不是 ServiceActivity 是更好的选择。

于 2015-10-23T10:01:33.673 回答
0

你应该使用回调。Android 团队在这里有一个指南:http: //developer.android.com/training/basics/fragments/communicating.html

于 2015-10-23T09:31:29.310 回答