Почему getSystemService не работает в адаптере при использовании фрагмента - PullRequest
0 голосов
/ 15 июня 2019

Сейчас я пытаюсь трансплантировать исходный код, но разница между мной и кодом github заключается в том, что он сделан Activty, но я сделал фрагмент, поэтому мне нужно изменить какой-то код при пересадке после того, как я изменил трансплантацию во фрагмент, метод getSystemService не сделал 'не работает, что происходит в этом вопросе?

Это мой фрагмент (был создан Activity, но я изменяю его фрагмент

package com.example.together.Fragment;

import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ExpandableListView;

import com.example.together.Activities.GoodbyePet.CheckedActivity;
import com.example.together.Activities.GoodbyePet.ConstantManager;
import com.example.together.Activities.GoodbyePet.MyCategoriesExpandableListAdapter;
import com.example.together.Model.DataItem;
import com.example.together.Model.SubCategoryItem;
import com.example.together.R;
import java.util.ArrayList;
import java.util.HashMap;

public class TabFragment1 extends Fragment {

private Button btn;
private ExpandableListView lvCategory;

private ArrayList<DataItem> arCategory;
private ArrayList<SubCategoryItem> arSubCategory;
private ArrayList<ArrayList<SubCategoryItem>> arSubCategoryFinal;

private ArrayList<HashMap<String, String>> parentItems;
private ArrayList<ArrayList<HashMap<String, String>>> childItems;
private MyCategoriesExpandableListAdapter myCategoriesExpandableListAdapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.tab_fragment_1, container, false);
    btn = view.findViewById(R.id.btn);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getActivity(), CheckedActivity.class);
            startActivity(intent);
        }
    });

    setupReferences(view);
    return view;
}

private void setupReferences(View view) {

    lvCategory = view.findViewById(R.id.lvCategory);
    arCategory = new ArrayList<>();
    arSubCategory = new ArrayList<>();
    parentItems = new ArrayList<>();
    childItems = new ArrayList<>();

    DataItem dataItem = new DataItem();
    dataItem.setCategoryId("1");
    dataItem.setCategoryName("Adventure");

    arSubCategory = new ArrayList<>();
    for (int i = 1; i < 6; i++) {

        SubCategoryItem subCategoryItem = new SubCategoryItem();
        subCategoryItem.setCategoryId(String.valueOf(i));
        subCategoryItem.setIsChecked(ConstantManager.CHECK_BOX_CHECKED_FALSE);
        subCategoryItem.setSubCategoryName("Adventure: " + i);
        arSubCategory.add(subCategoryItem);
    }
    dataItem.setSubCategory(arSubCategory);
    arCategory.add(dataItem);

    dataItem = new DataItem();
    dataItem.setCategoryId("2");
    dataItem.setCategoryName("Art");
    arSubCategory = new ArrayList<>();
    for (int j = 1; j < 6; j++) {

        SubCategoryItem subCategoryItem = new SubCategoryItem();
        subCategoryItem.setCategoryId(String.valueOf(j));
        subCategoryItem.setIsChecked(ConstantManager.CHECK_BOX_CHECKED_FALSE);
        subCategoryItem.setSubCategoryName("Art: " + j);
        arSubCategory.add(subCategoryItem);
    }
    dataItem.setSubCategory(arSubCategory);
    arCategory.add(dataItem);

    dataItem = new DataItem();
    dataItem.setCategoryId("3");
    dataItem.setCategoryName("Cooking");
    arSubCategory = new ArrayList<>();
    for (int k = 1; k < 6; k++) {

        SubCategoryItem subCategoryItem = new SubCategoryItem();
        subCategoryItem.setCategoryId(String.valueOf(k));
        subCategoryItem.setIsChecked(ConstantManager.CHECK_BOX_CHECKED_FALSE);
        subCategoryItem.setSubCategoryName("Cooking: " + k);
        arSubCategory.add(subCategoryItem);
    }

    dataItem.setSubCategory(arSubCategory);
    arCategory.add(dataItem);

    Log.d("TAG", "setupReferences: " + arCategory.size());

    for (DataItem data : arCategory) {
//                        Log.i("Item id",item.id);
        ArrayList<HashMap<String, String>> childArrayList = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> mapParent = new HashMap<String, String>();

        mapParent.put(ConstantManager.Parameter.CATEGORY_ID, data.getCategoryId());
        mapParent.put(ConstantManager.Parameter.CATEGORY_NAME, data.getCategoryName());

        int countIsChecked = 0;
        for (SubCategoryItem subCategoryItem : data.getSubCategory()) {

            HashMap<String, String> mapChild = new HashMap<String, String>();
            mapChild.put(ConstantManager.Parameter.SUB_ID, subCategoryItem.getSubId());
            mapChild
                    .put(ConstantManager.Parameter.SUB_CATEGORY_NAME, subCategoryItem.getSubCategoryName());
            mapChild.put(ConstantManager.Parameter.CATEGORY_ID, subCategoryItem.getCategoryId());
            mapChild.put(ConstantManager.Parameter.IS_CHECKED, subCategoryItem.getIsChecked());

            if (subCategoryItem.getIsChecked()
                    .equalsIgnoreCase(ConstantManager.CHECK_BOX_CHECKED_TRUE)) {

                countIsChecked++;
            }
            childArrayList.add(mapChild);
        }

        if (countIsChecked == data.getSubCategory().size()) {

            data.setIsChecked(ConstantManager.CHECK_BOX_CHECKED_TRUE);
        } else {
            data.setIsChecked(ConstantManager.CHECK_BOX_CHECKED_FALSE);
        }

        mapParent.put(ConstantManager.Parameter.IS_CHECKED, data.getIsChecked());
        childItems.add(childArrayList);
        parentItems.add(mapParent);

    }

    ConstantManager.parentItems = parentItems;
    ConstantManager.childItems = childItems;

    myCategoriesExpandableListAdapter = new MyCategoriesExpandableListAdapter(TabFragment1.this, parentItems, childItems, false);
    lvCategory.setAdapter(myCategoriesExpandableListAdapter);
}
} 

Это мой адаптер с ошибкой

package com.example.together.Activities.GoodbyePet;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.together.R;

import java.util.ArrayList;
import java.util.HashMap;
import com.example.together.Fragment.TabFragment1;



public class MyCategoriesExpandableListAdapter extends BaseExpandableListAdapter {

public static ArrayList<ArrayList<HashMap<String, String>>> childItems;
public static ArrayList<HashMap<String, String>> parentItems;
//    private final ArrayList<HashMap<String, String>> childItems;
private LayoutInflater inflater;
private TabFragment1 activity;
private HashMap<String, String> child;
private int count = 0;
private boolean isFromMyCategoriesFragment;

public MyCategoriesExpandableListAdapter(TabFragment1 activity, ArrayList<HashMap<String, String>> parentItems,
                                         ArrayList<ArrayList<HashMap<String, String>>> childItems, boolean isFromMyCategoriesFragment) {

    this.parentItems = parentItems;
    this.childItems = childItems;
    this.activity = activity;
    this.isFromMyCategoriesFragment = isFromMyCategoriesFragment;
    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

@Override
public int getGroupCount() {
    return parentItems.size();
}

@Override
public int getChildrenCount(int groupPosition) {
    return (childItems.get(groupPosition)).size();
}

@Override
public Object getGroup(int i) {
    return null;
}

@Override
public Object getChild(int i, int i1) {
    return null;
}

@Override
public long getGroupId(int i) {
    return 0;
}

@Override
public long getChildId(int i, int i1) {
    return 0;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public View getGroupView(final int groupPosition, final boolean b, View convertView, ViewGroup viewGroup) {
     final ViewHolderParent viewHolderParent;
    if (convertView == null) {

        if(isFromMyCategoriesFragment) {
            convertView = inflater.inflate(R.layout.group_list_layout_my_categories, null);
        }else {
            convertView = inflater.inflate(R.layout.group_list_layout_choose_categories, null);
        }
        viewHolderParent = new ViewHolderParent();

        viewHolderParent.tvMainCategoryName = convertView.findViewById(R.id.tvMainCategoryName);
        viewHolderParent.cbMainCategory = convertView.findViewById(R.id.cbMainCategory);
        viewHolderParent.ivCategory = convertView.findViewById(R.id.ivCategory);
        convertView.setTag(viewHolderParent);
    } else {
        viewHolderParent = (ViewHolderParent) convertView.getTag();
    }

    if (parentItems.get(groupPosition).get(ConstantManager.Parameter.IS_CHECKED).equalsIgnoreCase(ConstantManager.CHECK_BOX_CHECKED_TRUE)) {
        viewHolderParent.cbMainCategory.setChecked(true);
        notifyDataSetChanged();

    } else {
        viewHolderParent.cbMainCategory.setChecked(false);
        notifyDataSetChanged();
    }

    viewHolderParent.cbMainCategory.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (viewHolderParent.cbMainCategory.isChecked()) {
                parentItems.get(groupPosition).put(ConstantManager.Parameter.IS_CHECKED, ConstantManager.CHECK_BOX_CHECKED_TRUE);

                for (int i = 0; i < childItems.get(groupPosition).size(); i++) {
                    childItems.get(groupPosition).get(i).put(ConstantManager.Parameter.IS_CHECKED, ConstantManager.CHECK_BOX_CHECKED_TRUE);
                }
                notifyDataSetChanged();

            }
            else {
                parentItems.get(groupPosition).put(ConstantManager.Parameter.IS_CHECKED, ConstantManager.CHECK_BOX_CHECKED_FALSE);
                for (int i = 0; i < childItems.get(groupPosition).size(); i++) {
                    childItems.get(groupPosition).get(i).put(ConstantManager.Parameter.IS_CHECKED, ConstantManager.CHECK_BOX_CHECKED_FALSE);
                }
                notifyDataSetChanged();
            }
        }
    });

    ConstantManager.childItems = childItems;
    ConstantManager.parentItems = parentItems;

    viewHolderParent.tvMainCategoryName.setText(parentItems.get(groupPosition).get(ConstantManager.Parameter.CATEGORY_NAME));

    return convertView;
}

@Override
public View getChildView(final int groupPosition, final int childPosition, final boolean b, View convertView, ViewGroup viewGroup) {

    final ViewHolderChild viewHolderChild;
    child = childItems.get(groupPosition).get(childPosition);

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.child_list_layout_choose_category, null);
        viewHolderChild = new ViewHolderChild();

        viewHolderChild.tvSubCategoryName = convertView.findViewById(R.id.tvSubCategoryName);
        viewHolderChild.cbSubCategory = convertView.findViewById(R.id.cbSubCategory);
        viewHolderChild.viewDivider = convertView.findViewById(R.id.viewDivider);
        convertView.setTag(viewHolderChild);
    } else {
        viewHolderChild = (ViewHolderChild) convertView.getTag();
    }

    if (childItems.get(groupPosition).get(childPosition).get(ConstantManager.Parameter.IS_CHECKED).equalsIgnoreCase(ConstantManager.CHECK_BOX_CHECKED_TRUE)) {
        viewHolderChild.cbSubCategory.setChecked(true);
        notifyDataSetChanged();
    } else {
        viewHolderChild.cbSubCategory.setChecked(false);
        notifyDataSetChanged();
    }

    viewHolderChild.tvSubCategoryName.setText(child.get(ConstantManager.Parameter.SUB_CATEGORY_NAME));
    viewHolderChild.cbSubCategory.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (viewHolderChild.cbSubCategory.isChecked()) {
                count = 0;
                childItems.get(groupPosition).get(childPosition).put(ConstantManager.Parameter.IS_CHECKED, ConstantManager.CHECK_BOX_CHECKED_TRUE);
                notifyDataSetChanged();
            } else {
                count = 0;
                childItems.get(groupPosition).get(childPosition).put(ConstantManager.Parameter.IS_CHECKED, ConstantManager.CHECK_BOX_CHECKED_FALSE);
                notifyDataSetChanged();
            }

            for (int i = 0; i < childItems.get(groupPosition).size(); i++) {
                if (childItems.get(groupPosition).get(i).get(ConstantManager.Parameter.IS_CHECKED).equalsIgnoreCase(ConstantManager.CHECK_BOX_CHECKED_TRUE)) {
                    count++;
                }
            }
            if (count == childItems.get(groupPosition).size()) {
                parentItems.get(groupPosition).put(ConstantManager.Parameter.IS_CHECKED, ConstantManager.CHECK_BOX_CHECKED_TRUE);
                notifyDataSetChanged();
            } else {
                parentItems.get(groupPosition).put(ConstantManager.Parameter.IS_CHECKED, ConstantManager.CHECK_BOX_CHECKED_FALSE);
                notifyDataSetChanged();
            }


            ConstantManager.childItems = childItems;
            ConstantManager.parentItems = parentItems;
        }
    });

    return convertView;
}

@Override
public boolean isChildSelectable(int i, int i1) {
    return false;
}
@Override
public void onGroupCollapsed(int groupPosition) {
    super.onGroupCollapsed(groupPosition);
}

@Override
public void onGroupExpanded(int groupPosition) {
    super.onGroupExpanded(groupPosition);
}

private class ViewHolderParent {

    TextView tvMainCategoryName;
    CheckBox cbMainCategory;
    ImageView ivCategory;
}

private class ViewHolderChild {

    TextView tvSubCategoryName;
    CheckBox cbSubCategory;
    View viewDivider;
}


}

Это ошибка (getSystemService ()) в адаптере

inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

Я не понимаю, что это не было ошибкой, но после изменения источника действия в Fragment itпроизошла ошибка Как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 15 июня 2019

Измените эту строку TabFragment1

 myCategoriesExpandableListAdapter = new MyCategoriesExpandableListAdapter(TabFragment1.this, parentItems, childItems, false);

на этот

 myCategoriesExpandableListAdapter = new MyCategoriesExpandableListAdapter(getActivity(), parentItems, childItems, false);

и MyCategoriesExpandableListAdapter конструктор как

 public MyCategoriesExpandableListAdapter(Activity activity, ArrayList<HashMap<String, String>> parentItems,
                                         ArrayList<ArrayList<HashMap<String, String>>> childItems, boolean isFromMyCategoriesFragment) {

    this.parentItems = parentItems;
    this.childItems = childItems;
    this.activity = activity;
    this.isFromMyCategoriesFragment = isFromMyCategoriesFragment;
    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

Также измените тип activity наActivity

0 голосов
/ 17 июня 2019

этот код во фрагменте

 myCategoriesExpandableListAdapter = new MyCategoriesExpandableListAdapter(getActivity(),TabFragment1.this, parentItems, childItems, false);

Попробуйте этот код в адаптере

public MyCategoriesExpandableListAdapter(Context context,TabFragment1 activity, ArrayList<HashMap<String, String>> parentItems,
                                     ArrayList<ArrayList<HashMap<String, String>>> childItems, boolean isFromMyCategoriesFragment) {

this.parentItems = parentItems;
this.childItems = childItems;
this.mContext= context;
this.activity = activity;
this.isFromMyCategoriesFragment = isFromMyCategoriesFragment;
inflater = LayoutInflater.from(context);
}
0 голосов
/ 15 июня 2019

Простое исправление. Существуют изменения кода при преобразовании действия во фрагмент.

Вместо:

inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

Просто небольшое изменение:

inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
...