Начиная с одного занятия, я открываю другое и фильтрую результат пользовательского просмотра списка.
Это первое занятие:
public class PersonaFragment extends Fragment {
private PersonaAdapter personaAdapter;
private ListView personeListView;
private ArrayList<Persona> personeList = new ArrayList<Persona>();
private ArrayList<String> listIdClas = new ArrayList<String>();
private final static int INSERT_REQUEST = 1;
private final static int FILTER_REQUEST = 2;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.persona_fragment, null);
setHasOptionsMenu(true);
personaAdapter = new PersonaAdapter(getActivity(), personeList, R.layout.persona_row_layout);
personeListView = view.findViewById(R.id.lvPersone);
personeListView.setAdapter(personaAdapter);
blsRequest request = new blsRequest(getActivity(), blsVolleyResponse());
request.add(blsUrl.listaPersone(), "00");
return view;
}
private void startFilterActivity() {
Intent intent = new Intent(getActivity(), PersonaFilterActivity.class);
intent.putStringArrayListExtra("listIdClas", this.listIdClas);
startActivityForResult(intent, FILTER_REQUEST);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == FILTER_REQUEST) {
if (resultCode == RESULT_OK) {
this.listIdClas = data.getStringArrayListExtra("listIdClas");
personaAdapter.filterManual(this.listIdClas);
}
}
}
private blsVolleyResponse blsVolleyResponse() {
return new blsVolleyResponse() {
@Override
public void onResponse(String result, String tag) {
switch (tag) {
case "00":
personeList = blsJSON.ParseList(result, tag);
personaAdapter.updateData(personeList);
break;
}
}
@Override
public void onError(VolleyError error, String tag) {
Toast.makeText(getActivity(), "Ops! Qualcosa è andato storto", Toast.LENGTH_SHORT).show();
blsLog.i("blsVolleyResponse.onError: TAG = " + tag + " ERROR = " + error);
}
};
}
}
и это действие фильтра:
public class PersonaFilterActivity extends AppCompatActivity {
private ClasseAdapter classeAdapter;
private ListView classiListView;
private ArrayList<Classe> classiList = new ArrayList<Classe>();
private ArrayList<String> listIdClas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.persona_filter_activity);
Bundle extras = getIntent().getExtras();
if (extras != null) {
listIdClas = extras.getStringArrayList("listIdClas");
}
classiListView = findViewById(R.id.lvClassi);
classeAdapter = new ClasseAdapter(this, classiList);
classiListView.setAdapter(classeAdapter);
classiListView.addOnLayoutChangeListener(onListLoaded);
blsRequest request = new blsRequest(this, blsVolleyResponse());
request.add(blsUrl.listaClassi(), "00");
}
private View.OnLayoutChangeListener onListLoaded = new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
setFilter();
}
};
private void applyFilter() {
fillListId();
Intent returnIntent = new Intent();
returnIntent.putStringArrayListExtra("listIdClas", listIdClas);
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
private void fillListId() {
listIdClas.clear();
for (int i = 0; i < classiListView.getChildCount(); i++) {
View child = classiListView.getChildAt(i);
Classe classe = (Classe) classiListView.getItemAtPosition(i);
Switch aSwitch = child.findViewById(R.id.swFlt);
if (aSwitch.isChecked())
listIdClas.add(classe.getId());
}
}
private void ReturnValue(int Result) {
Intent returnIntent = new Intent();
setResult(Result, returnIntent);
finish();
}
private void clearFilter() {
listIdClas.clear();
for (int i = 0; i < classiListView.getChildCount(); i++) {
View child = classiListView.getChildAt(i);
Switch aSwitch = child.findViewById(R.id.swFlt);
aSwitch.setChecked(false);
}
}
private void setFilter() {
for (int i = 0; i < classiListView.getChildCount(); i++) {
for (String idCat : listIdClas) {
View child = classiListView.getChildAt(i);
Switch aSwitch = child.findViewById(R.id.swFlt);
Classe classe = (Classe) classiListView.getItemAtPosition(i);
if (classe.getId().compareTo(idCat) == 0)
aSwitch.setChecked(true);
}
}
}
private blsVolleyResponse blsVolleyResponse() {
return new blsVolleyResponse() {
@Override
public void onResponse(String result, String tag) {
switch (tag) {
case "00":
classiList = blsJSON.ParseList(result, tag);
classeAdapter.updateData(classiList);
break;
}
}
@Override
public void onError(VolleyError error, String tag) {
Toast.makeText(PersonaFilterActivity.this, "Ops! Qualcosa è andato storto", Toast.LENGTH_SHORT).show();
blsLog.i("blsVolleyResponse.onError: TAG = " + tag + " ERROR = " + error);
}
};
}
}
Как видите, я не использую:
classiListView.getCount()
но
classiListView.getChildCount()
Поскольку в списке фильтров много элементов, и если я использую "getCount ()", я получаю сообщение об ошибке:
«Попытка вызвать виртуальный метод 'android.view.View android.view.View.findViewById (int)' для пустой ссылки на объект"
У меня нет проблем с фильтрацией настраиваемого адаптера просмотра списка: используя список массивов, я сохраняю выбранный идентификатор строк и применяю их при первом просмотре списка действий. Сейчас мне нужно открыть второе действие и установить проверенный объект Switch для каждой строки (если он был / не был отмечен), но когда я повторно нажимаю кнопку фильтра, чтобы добавить другие фильтры, список элементов фильтра не восстанавливаются правильно , из-за использования "getChildCount ()".
Надеюсь, мне было ясно. Как мне это сделать?