SectionedRecyclerViewAdapter внутри фрагмента обновления фрагмента для данных изменен

Я использую SectionedRecyclerViewAdapter для создания нескольких разделов в представлении реселлера. Проблема в том, когда я запускаю switchcompat, я хочу, чтобы оба раздела были обновлены. Это означает, что всякий раз, когда я изменяю состояние switchcompat на отмеченный, я хочу, чтобы элемент удалялся из списка всех приложений и добавлялся в список заблокированных приложений, и наоборот. Другими словами, я хочу, чтобы мой фрагмент обновлялся всякий раз, когда я запускаю switchcompat.

Каков наилучший способ достичь этого?

Фрагмент

public class AppListFragment extends Fragment {

    Context mContext;
    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    RecyclerView.LayoutManager recyclerViewLayoutManager;

    private SectionedRecyclerViewAdapter sectionAdapter;

    public AppListFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View appListView = inflater.inflate(R.layout.fragment_app_list,container,false);

        sectionAdapter = new SectionedRecyclerViewAdapter();

        List<AppItem> lockedAppItemList = getLockedAppList(inflater.getContext());
        List<AppItem> allAppItemList = getAllAppList(inflater.getContext());

        sectionAdapter.addSection(new SectionLockedApps("Locked Apps", inflater.getContext(),new AppManager(inflater.getContext()).getAllInstalledApkInfo(), lockedAppItemList,sectionAdapter));
        sectionAdapter.addSection(new SectionAllApps("All Apps", inflater.getContext(),new AppManager(inflater.getContext()).getAllInstalledApkInfo(), allAppItemList,sectionAdapter));

        try {
            recyclerView = (RecyclerView) appListView.findViewById(R.id.rv_applist);
            recyclerViewLayoutManager = new LinearLayoutManager(this.getContext());
            recyclerView.setLayoutManager(recyclerViewLayoutManager);
            //adapter = new AppsAdapter(inflater.getContext(), new AppManager(inflater.getContext()).getAllInstalledApkInfo());
            recyclerView.setAdapter(sectionAdapter);

        }catch (Exception ex){
            Log.i("exception",ex.getMessage());
        }

        return appListView;
    }

    @Override
    public void onResume() {
        super.onResume();

        if (getActivity() instanceof AppCompatActivity) {
            AppCompatActivity activity = ((AppCompatActivity) getActivity());
            if (activity.getSupportActionBar() != null) {
                activity.getSupportActionBar().setTitle(R.string.app_name);
            }
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        mContext = context;
    }

    private List<AppItem> getLockedAppList(Context ctx) {
        AppManager appManager = new AppManager(ctx);
        List<AppItem> appItemList = new ArrayList<>();
        List<String> apkPackInfoList = appManager.getAllInstalledApkInfo();

        for(String apkPackInfo:apkPackInfoList){
            String appName = appManager.getAppName(apkPackInfo);
            Drawable imageDrawable = appManager.getAppIconByPackageName(apkPackInfo);
            Boolean isLocked = appManager.isGuardEnabled(apkPackInfo);
            if(isLocked){
                appItemList.add(new AppItem(imageDrawable,appName,apkPackInfo,isLocked));
            }
        }

        return appItemList;
    }

    private List<AppItem> getAllAppList(Context ctx) {
        AppManager appManager = new AppManager(ctx);
        List<AppItem> appItemList = new ArrayList<>();
        List<String> apkPackInfoList = appManager.getAllInstalledApkInfo();

        for(String apkPackInfo:apkPackInfoList){
            String appName = appManager.getAppName(apkPackInfo);
            Drawable imageDrawable = appManager.getAppIconByPackageName(apkPackInfo);
            Boolean isLocked = appManager.isGuardEnabled(apkPackInfo);
            if(!isLocked){
                appItemList.add(new AppItem(imageDrawable,appName,apkPackInfo,isLocked));
            }
        }

        return appItemList;
    }
}

Раздел заблокированных приложений

public class SectionLockedApps extends StatelessSection {

    private SectionedRecyclerViewAdapter sectionAdapter;

    String title;
    boolean isGuardEnabled;
    Context ctxAppList;
    List<String> stringList;
    List<AppItem> appItemList;

    public SectionLockedApps(String title, Context ctx, List<String> stringList, List<AppItem> appItemList, SectionedRecyclerViewAdapter sectionAdapter) {
        super(SectionParameters.builder()
                .itemResourceId(R.layout.cardview_layout_applist)
                .headerResourceId(R.layout.section_header)
                .build());

        this.title = title;
        this.ctxAppList = ctx;
        this.stringList = stringList;
        this.appItemList = appItemList;
        this.sectionAdapter = sectionAdapter;
    }

    @Override
    public int getContentItemsTotal() {
        return appItemList.size();
    }

    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, final int position) {

        final AppManager appManager = new AppManager(ctxAppList);
        final String applicationPackageName = appItemList.get(position).getPackageName();
        isGuardEnabled = appManager.isGuardEnabled(applicationPackageName);

        if (appItemList.size() > 0) {
            String ApplicationLabelName = appItemList.get(position).getAppName();
            Drawable drawable = appItemList.get(position).getImageDrawable();



            final ItemViewHolder itemHolder = (ItemViewHolder) holder;

            itemHolder.textView_App_Name.setText(ApplicationLabelName);

            //viewHolder.textView_App_Package_Name.setText(applicationPackageName);

            itemHolder.imageView.setImageDrawable(drawable);

            itemHolder.switchCompat.setChecked(isGuardEnabled);

            //Adding click listener on CardView to open clicked application directly from here .
            itemHolder.rootView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent intent = ctxAppList.getPackageManager().getLaunchIntentForPackage(applicationPackageName);
                    if (intent != null) {

                        ctxAppList.startActivity(intent);

                    } else {

                        Toast.makeText(ctxAppList, applicationPackageName + " Error, Please Try Again.", Toast.LENGTH_LONG).show();
                    }
                }
            });

            itemHolder.switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    appManager.setGuard(applicationPackageName, isChecked);
                    //appItemList.get(position).setLocked(isChecked);

                }
            });
        }

    }

    @Override
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
        return  new HeaderViewHolder(view);
    }

    @Override
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
        HeaderViewHolder headerHolder = (HeaderViewHolder) holder;

        if(appItemList.size()>0){
            headerHolder.tvTitle.setText(title);
        }else {
            headerHolder.tvTitle.setVisibility(View.GONE);
        }



    }

    private class HeaderViewHolder extends RecyclerView.ViewHolder {

        private final TextView tvTitle;

        HeaderViewHolder(View view) {
            super(view);
            tvTitle = (TextView) view.findViewById(R.id.tvTitle);
        }
    }

    private class ItemViewHolder extends RecyclerView.ViewHolder {

        private final View rootView;

        public TextView textView_App_Name;
        public ImageView imageView;
        public SwitchCompat switchCompat;

        ItemViewHolder(View view) {
            super(view);

            rootView = view;

            textView_App_Name = (TextView) view.findViewById(R.id.Apk_Name);
            imageView = (ImageView) view.findViewById(R.id.imgApplist);
            switchCompat = (SwitchCompat) view.findViewById(R.id.compatSwitch);

        }
    }

}

Раздел Все приложения

public class SectionAllApps extends StatelessSection {

    String title;
    boolean isGuardEnabled;
    Context ctxAppList;
    List<String> stringList;
    List<AppItem> appItemList;
    String applicationPackageName;
    AppManager appManager;

    private SectionedRecyclerViewAdapter sectionAdapter;

    public SectionAllApps(String title, Context ctx, List<String> stringList, List<AppItem> appItemList, SectionedRecyclerViewAdapter sectionAdapter) {
        super(SectionParameters.builder()
                .itemResourceId(R.layout.cardview_layout_applist)
                .headerResourceId(R.layout.section_header)
                .build());

        this.title = title;
        this.ctxAppList = ctx;
        this.stringList = stringList;
        this.appItemList = appItemList;
        this.sectionAdapter = sectionAdapter;
    }

    @Override
    public int getContentItemsTotal() {
        return appItemList.size();
    }

    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, final int position) {

        final AppManager appManager = new AppManager(ctxAppList);
        final String applicationPackageName = appItemList.get(position).getPackageName();
        isGuardEnabled = appManager.isGuardEnabled(applicationPackageName);

        if (appItemList.size() > 0) {
            String ApplicationLabelName = appItemList.get(position).getAppName();
            Drawable drawable = appItemList.get(position).getImageDrawable();



            final SectionAllApps.ItemViewHolder itemHolder = (SectionAllApps.ItemViewHolder) holder;

            itemHolder.textView_App_Name.setText(ApplicationLabelName);

            //viewHolder.textView_App_Package_Name.setText(applicationPackageName);

            itemHolder.imageView.setImageDrawable(drawable);

            itemHolder.switchCompat.setChecked(isGuardEnabled);

            //Adding click listener on CardView to open clicked application directly from here .
            itemHolder.rootView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent intent = ctxAppList.getPackageManager().getLaunchIntentForPackage(applicationPackageName);
                    if (intent != null) {

                        ctxAppList.startActivity(intent);

                    } else {

                        Toast.makeText(ctxAppList, applicationPackageName + " Error, Please Try Again.", Toast.LENGTH_LONG).show();
                    }
                }
            });

            itemHolder.switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    appManager.setGuard(applicationPackageName, isChecked);

                    //appItemList.get(position).setLocked(isChecked);

                }
            });
        }
    }

    @Override
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
        return new HeaderViewHolder(view);
    }

    @Override
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
        HeaderViewHolder headerHolder = (HeaderViewHolder) holder;

        headerHolder.tvTitle.setText(title);
    }

    private class HeaderViewHolder extends RecyclerView.ViewHolder {

        private final TextView tvTitle;

        HeaderViewHolder(View view) {
            super(view);
            tvTitle = (TextView) view.findViewById(R.id.tvTitle);
        }
    }

    private class ItemViewHolder extends RecyclerView.ViewHolder {

        private final View rootView;
        public ImageView imageView;
        public TextView textView_App_Name;
        public SwitchCompat switchCompat;


        ItemViewHolder(View view) {
            super(view);

            rootView = view;

            imageView = (ImageView) view.findViewById(R.id.imgApplist);
            textView_App_Name = (TextView) view.findViewById(R.id.Apk_Name);
            switchCompat = (SwitchCompat) view.findViewById(R.id.compatSwitch);
        }
    }
}

appManager.SetGuard() в основном сохраняет последнее состояние switchcompat.

1 ответ

Решение

После некоторых исследований я нашел решение для моей проблемы. Решение заключалось не в работе со списком приложений, а в обновлении фрагмента. В основном я создал интерфейс, который используется для обоих моих разделов при выполнении сценария с методом refresh(); и сделал реализацию внутри моего фрагмента

Коды написаны ниже:

Интерфейс

public interface IFragmentOperation {
    public void refresh();
}

Модификации в ферменте

public class AppListFragment extends Fragment implements IFragmentOperation {
....

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

    sectionAdapter.addSection(new SectionLockedApps("Locked Apps", inflater.getContext(),lockedAppItemList,this));
    sectionAdapter.addSection(new SectionAllApps("All Apps", inflater.getContext(),allAppItemList,this));

    ...
}

//Refresh fragment on switchcompat touched
@Override
public void refresh() {
    FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
    fragmentTransaction.detach(this).attach(this).commit();
}

}

Как вы можете видеть, я реализовал интерфейс с методом refresh() и добавил дополнительный параметр это внутри моего секции cunstructor. Таким образом, я отправляю реализацию интерфейса в классы моего раздела.

Тогда в моем разделе я просто создаю IFragmentOperation fragmentOperation; и присвоение значения fragmentOperation внутри конструктор

IFragmentOperation fragmentOperation;

public SectionLockedApps(String title, Context ctx,List<AppItem> appItemList,IFragmentOperation fragmentOperation) {
    super(SectionParameters.builder()
            .itemResourceId(R.layout.cardview_layout_applist)
            .headerResourceId(R.layout.section_header)
            .build());

    this.title = title;
    this.ctxAppList = ctx;
    this.appItemList = appItemList;
    this.fragmentOperation = fragmentOperation;
}

и использовать его там, где это необходимо, как это fragmentOperation.refresh();

itemHolder.switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        appManager.setGuard(applicationPackageName, isChecked);
        //appItemList.get(position).setLocked(isChecked);
        fragmentOperation.refresh();

    }
});

Вот и все. Надеюсь, что это поможет кому-то с проблемой.

Другие вопросы по тегам