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();
}
});
Вот и все. Надеюсь, что это поможет кому-то с проблемой.