Я разрабатываю приложение, в котором у меня есть список покемонов, ListView находится внутри фрагмента, когда я нажимаю на покемона, приложение переходит к другому действию, которое содержит фрагменты с деталями покемонов, все до этого момента работает хорошо ,
У меня есть меню, которое включает в себя SearchView, поиск работает нормально, но проблема возникает, когда я нажимаю на покемона, приложение отображает сведения о покемоне, который находится в этом месте в ListView, вместо того, чтобы показывать информацию о правом покемоне, на которого я нажал.
(пока не могу выложить изображения)
Перед поиском у меня есть:
Мой список:
Бульбасавр (идентификатор в ListView = 0)
Ивисавр (идентификатор в ListView = 1)
Венусавр (идентификатор в ListView = 2)
Charmander (идентификатор в ListView = 3)
Charmeleon (идентификатор в ListView = 4)
и т.д ...
Затем я нажимаю на Ivysaur и получаю детали Ivysaur
Когда я выполняю поиск, я получаю это:
Я ищу покемона, содержащего "b", и мой список превращается в нечто подобное:
Бульбасавр (идентификатор в ListView = 0)
Бластуаз (идентификатор в ListView = 1)
Без масла (идентификатор в ListView = 2)
Beedrill (идентификатор в ListView = 3)
и т.д ...
Я нажимаю на Blastoise (с ID = 1), и я получаю детали Ivysaur
Я думаю, это потому, что в первоначальном списке Ivysaur имел ID = 1.
BindFragmentsPokedexActivity.java
public class BindFragmentsPokedexActivity extends AppCompatActivity
implements PokedexFragment.OnFragmentInteractionListener
, PokedexSettingsDialogFragment.OnPokemonTypeFilterListener {
@BindView(R.id.toolbarPokedex)
Toolbar toolbar;
private ListView pkmListView;
private List<Pokemon> pkmList;
private PokedexAdapter adapter;
public static int filterFlag;
@Override
protected void onCreate(Bundle savedInstanceState) { /*m./*m.onCreate*/
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bind_fragments_pokedex);
ButterKnife.bind(this);
toolbar();
} /*m.onCreate*/
@Override
public void onPokemonClick(Pokemon pkm) { /*m.onPokemonClick*/
setPokedexDataExtras(pkm);
} /*m.onPokemonClick*/
private void setPokedexDataExtras(Pokemon pkm) { /*m.setPokedexDataExtras*/
Intent intent = new Intent(this, PokemonDetailsActivity.class);
intent.putExtra("NormalPkmPic", pkm.getPokemonPicResId());
intent.putExtra("ShinyPkmPic", pkm.getPokemonShinyPicResId());
intent.putExtra("PkmName", pkm.getPokemonName());
intent.putExtra("PkmDexNum", pkm.getPokemonDexNum());
intent.putExtra("PkmType1", pkm.getPokemonType1());
intent.putExtra("PkmType2", pkm.getPokemonType2());
intent.putExtra("DexNum", pkm.getDexNum());
intent.putExtra("isMega", pkm.isMega());
intent.putExtra("isAlolan", pkm.isAlolan());
intent.putExtra("PkmType1Search", pkm.getPokemonType1Search());
intent.putExtra("PkmType2Search", pkm.getPokemonType2Search());
startActivity(intent);
} /*m.setPokedexDataExtras*/
@Override
public boolean onCreateOptionsMenu(Menu menu) { /*m.onCreateOptionsMenu*/
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.pokedex_menu, menu);
pkmListView = findViewById(R.id.listViewPokedex);
pkmList = PokemonDataSource.getPokemonList();
adapter = new PokedexAdapter(BindFragmentsPokedexActivity.this, R.layout.list_view_pokemon
, pkmList);
pkmListView.setAdapter(adapter);
filterFlag = 0;
MenuItem searchItem = menu.findItem(R.id.pokedex_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint(getResources().getString(R.string.search_menu));
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
});
return true;
} /*m.onCreateOptionsMenu*/
@Override
public boolean onOptionsItemSelected(MenuItem item) { /*m.onOptionsItemSelected*/
switch(item.getItemId()) { /*1.*/
case R.id.pokedex_type: {
break;
} /*case R.id.pokedex_type*/
case R.id.pokedex_settings: {
new PokedexSettingsDialogFragment().show(getSupportFragmentManager()
, "PokedexSettingsDialogFragment");
break;
} /*case R.id.pokedex_settings*/
} /*1.*/
return super.onOptionsItemSelected(item);
} /*m.onOptionsItemSelected*/
@Override
public void onTypeFilter(TextView pkmType) {
pkmType.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { /*m.beforeTextChanged*/
} /*m.beforeTextChanged*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { /*m.onTextChanged*/
filterFlag = 1;
adapter.getFilter().filter(s);
} /*m.onTextChanged*/
@Override
public void afterTextChanged(Editable s) { /*m.afterTextChanged*/
} /*m.afterTextChanged*/
});
} /*m.onTypeFilter*/
} //BindFragmentsPokedexActivity
PokedexFragment.java
public class PokedexFragment extends Fragment {
private Unbinder unbinder;
@BindView(R.id.listViewPokedex)
ListView pkmListView;
private PokedexAdapter pokedexAdapter;
private List<Pokemon> pkmList;
OnFragmentInteractionListener pkmListener;
public PokedexFragment() { /*c.PokedexFragment*/
// Required empty public constructor
} /*c.PokedexFragment*/
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { /*m.onCreateView*/
View view = inflater.inflate(R.layout.fragment_pokedex, container, false);
unbinder = ButterKnife.bind(this, view);
pkmList = PokemonDataSource.getPokemonList();
pokedexAdapter = new PokedexAdapter(getContext(), R.layout.list_view_pokemon, pkmList);
pkmListView.setAdapter(pokedexAdapter);
pkmListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { /*m.OnItemClickListener*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { /*m.onItemClick*/
pkmListener.onPokemonClick(pkmList.get(position));
} /*m.onItemClick*/
}); /*m.OnItemClickListener*/
return view;
} /*m.onCreateView*/
@Override
public void onAttach(Context context) { /*m.onAttach*/
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
pkmListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener");
}
} /*m.onAttach*/
@Override
public void onDetach() { /*m.onDetach*/
super.onDetach();
pkmListener = null;
} /*m.onDetach*/
@Override
public void onDestroyView() { /*m.onDestroyView*/
super.onDestroyView();
unbinder.unbind();
} /*m.onDestroyView*/
public interface OnFragmentInteractionListener { /*i.OnFragmentInteractionListener*/
void onPokemonClick(Pokemon pkm);
} /*i.OnFragmentInteractionListener*/
} //PokedexFragment
PokedexAdapter.java
public class PokedexAdapter extends BaseAdapter implements Filterable {
private Context context;
private int layout;
private List<Pokemon> pkmList;
private List<Pokemon> filterList;
private CustomFilter filter;
public PokedexAdapter(Context context, int layout, List<Pokemon> pkmList) { /*c.FilmsAdapter*/
this.context = context;
this.layout = layout;
this.pkmList = pkmList;
this.filterList = pkmList;
} /*c.FilmsAdapter*/
@Override
public int getCount() { /*m.getCount*/
return pkmList.size();
} /*m.getCount*/
@Override
public Pokemon getItem(int position) { /*m.getItem*/
return pkmList.get(position);
} /*m.getItem*/
@Override
public long getItemId(int position) { /*m.getItemId*/
return position;
} /*m.getItemId*/
@Override
public View getView(int position, View convertView, ViewGroup parent) { /*m.getView*/
ViewHolder viewHolder;
if(convertView == null) { /*1.*/
convertView = LayoutInflater.from(context).inflate(layout, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} /*1.*/
else { /*1.*/
viewHolder = (ViewHolder) convertView.getTag();
} /*1.*/
Pokemon currentPokemon = getItem(position);
Picasso.get().load(currentPokemon.getPokemonPicResId()).fit().into(viewHolder.ivPkmPic);
viewHolder.tvPkmName.setText(currentPokemon.getPokemonName());
viewHolder.tvPkmDexNum.setText(currentPokemon.getPokemonDexNum());
SetPokemonTypes.setTextViewType1(currentPokemon, viewHolder.tvPkmType1);
SetPokemonTypes.setTextViewType2(currentPokemon, viewHolder.tvPkmType1, viewHolder.tvPkmType2);
return convertView;
} /*m.getView*/
static class ViewHolder {
@BindView(R.id.pokemonPicture)
ImageView ivPkmPic;
@BindView(R.id.pokemonName)
TextView tvPkmName;
@BindView(R.id.pokemonDexNum)
TextView tvPkmDexNum;
@BindView(R.id.type1)
TextView tvPkmType1;
@BindView(R.id.type2)
TextView tvPkmType2;
ViewHolder(View convertView) { /*c.ViewHolder*/
ButterKnife.bind(this, convertView);
} /*c.ViewHolder*/
} //ViewHolder
@Override
public Filter getFilter() { /*m.getFilter*/
if(filter == null) { /*1.*/
filter = new CustomFilter();
} /*1.*/
return filter;
} /*m.getFilter*/
class CustomFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) { /*m.performFiltering*/
FilterResults results = new FilterResults();
//If there's nothing to filter on, return the original data for your list
if(constraint != null && constraint.length() > 0) { /*1.*/
//Constraint to upper
constraint = constraint.toString().toUpperCase();
List<Pokemon> filters = new ArrayList<>();
for(int i = 0; i < filterList.size(); i++) { /*1.1*/
if(filterList.get(i).getPokemonName().toUpperCase().contains(constraint)
&& BindFragmentsPokedexActivity.filterFlag == 0) { /*1.1.1*/
Pokemon pkm = new Pokemon(filterList.get(i).getPokemonPicResId()
, filterList.get(i).getPokemonShinyPicResId(), filterList.get(i).getPokemonName()
, filterList.get(i).getPokemonDexNum(), filterList.get(i).getPokemonType1()
, filterList.get(i).getPokemonType2(), filterList.get(i).getDexNum()
, filterList.get(i).isMega(), filterList.get(i).isAlolan()
, filterList.get(i).getPokemonType1Search()
, filterList.get(i).getPokemonType2Search());
filters.add(pkm);
} /*1.1.1*/
//filter per type
else { /*1.1.1*/
if(filterList.get(i).getPokemonType2Search() != null) { /*1.1.1.1*/
if(filterList.get(i).getPokemonType1Search().toUpperCase().contains(constraint)
|| filterList.get(i).getPokemonType2Search().toUpperCase().contains(constraint)
&& BindFragmentsPokedexActivity.filterFlag == 1) { /*1.1.1.1.1*/
Pokemon pkm = new Pokemon(filterList.get(i).getPokemonPicResId()
, filterList.get(i).getPokemonShinyPicResId(), filterList.get(i).getPokemonName()
, filterList.get(i).getPokemonDexNum(), filterList.get(i).getPokemonType1()
, filterList.get(i).getPokemonType2(), filterList.get(i).getDexNum()
, filterList.get(i).isMega(), filterList.get(i).isAlolan()
, filterList.get(i).getPokemonType1Search()
, filterList.get(i).getPokemonType2Search());
filters.add(pkm);
} /*1.1.1.1.1*/
} /*1.1.1.1*/
else { /*1.1.1.1*/
if(filterList.get(i).getPokemonType1Search().toUpperCase().contains(constraint)
&& BindFragmentsPokedexActivity.filterFlag == 1) { /*1.1.1.1.1*/
Pokemon pkm = new Pokemon(filterList.get(i).getPokemonPicResId()
, filterList.get(i).getPokemonShinyPicResId(), filterList.get(i).getPokemonName()
, filterList.get(i).getPokemonDexNum(), filterList.get(i).getPokemonType1()
, filterList.get(i).getPokemonType2(), filterList.get(i).getDexNum()
, filterList.get(i).isMega(), filterList.get(i).isAlolan()
, filterList.get(i).getPokemonType1Search()
, filterList.get(i).getPokemonType2Search());
filters.add(pkm);
} /*1.1.1.1.1*/
} /*1.1.1.1*/
} /*1.1.1*/
} /*1.1*/
results.count = filters.size();
results.values = filters;
} /*1.*/
else { /*1.*/
results.count = filterList.size();
results.values = filterList;
} /*1.*/
return results;
} /*m.performFiltering*/
@Override
protected void publishResults(CharSequence constraint, FilterResults results) { /*m.publishResults*/
pkmList = (List<Pokemon>) results.values;
notifyDataSetChanged();
} /*m.publishResults*/
} //customFilter
} //PokedexAdapter
PokemonDetailsActivity.java
public class PokemonDetailsActivity extends AppCompatActivity {
private int normalPkmPic;
private int shinyPkmPic;
private String pkmName;
private String pkmDexNum;
private int pkmType1;
private int pkmType2;
private boolean isMega;
private boolean isAlolan;
private int dexNum;
private String pokemonType1Search;
private String pokemonType2Search;
@BindView(R.id.detailsToolbar)
Toolbar toolbar;
@BindView(R.id.buttonLearnset)
Button buttonLearnset;
@Override
protected void onCreate(Bundle savedInstanceState) { /*m.onCreate*/
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pokemon_details);
ButterKnife.bind(this);
toolbar();
if(getIntent().getExtras() != null) { /*1.*/
getPkmPokedexDataExtras();
} /*1.*/
getFragments();
} /*m.onCreate*/
private void getPkmPokedexDataExtras() { /*m.getPkmPokedexDataExtras*/
normalPkmPic = getIntent().getIntExtra("NormalPkmPic", -1);
shinyPkmPic = getIntent().getIntExtra("ShinyPkmPic", -1);
pkmName = getIntent().getStringExtra("PkmName");
pkmDexNum = getIntent().getStringExtra("PkmDexNum");
pkmType1 = getIntent().getIntExtra("PkmType1", -1);
pkmType2 = getIntent().getIntExtra("PkmType2", -1);
isMega = getIntent().getBooleanExtra("isMega", true);
isAlolan = getIntent().getBooleanExtra("isAlolan", true);
dexNum = getIntent().getIntExtra("DexNum", -1);
pokemonType1Search = getIntent().getStringExtra("PkmType1Search");
pokemonType2Search = getIntent().getStringExtra("PkmType2Search");
} /*m.getPkmPokedexDataExtras*/
private void getFragments() { /*m.getFragments*/
Pokemon pokemon = new Pokemon(normalPkmPic, shinyPkmPic, pkmName, pkmDexNum, pkmType1, pkmType2
, dexNum, isMega, isAlolan, pokemonType1Search, pokemonType2Search);
MegaPokemon megaPokemon = new MegaPokemon(normalPkmPic, shinyPkmPic, pkmName, pkmDexNum, pkmType1
, pkmType2, dexNum, isMega, isAlolan, pokemonType1Search, pokemonType2Search);
AlolaFormPokemon alolaFormPokemon = new AlolaFormPokemon(normalPkmPic, shinyPkmPic, pkmName
, pkmDexNum, pkmType1, pkmType2, dexNum, isMega, isAlolan, pokemonType1Search
, pokemonType2Search);
PokemonDetailsFragment pkmDetailsFragment = (PokemonDetailsFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonDetailsFragmentLayout);
if(!isMega && !isAlolan) { /*pokemon*/
pkmDetailsFragment.renderPokemonData(pokemon);
} /*pokemon*/
else { /*pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmDetailsFragment.renderMegaPokemonData(megaPokemon);
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmDetailsFragment.renderAlolaFormPokemonData(alolaFormPokemon);
} /*alola form*/
} /*megas*/
} /*pokemon*/
FeaturesFragment pkmFeaturesFragment = (FeaturesFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonFeaturesFragmentLayout);
if(!isMega && !isAlolan) { /*pokemon*/
pkmFeaturesFragment.renderPokemonFeatures(pokemon);
} /*pokemon*/
else { /*pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmFeaturesFragment.renderMegaPokemonFeatures(megaPokemon);
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmFeaturesFragment.renderAlolaFormPokemonFeatures(alolaFormPokemon);
} /*alola form*/
} /*megas*/
} /*pokemon*/
StatsFragment pkmStatsFragment = (StatsFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonBaseStatsFragmentLayout);
if(!isMega && !isAlolan) { /*pokemon*/
pkmStatsFragment.renderPokemonStats(pokemon);
} /*pokemon*/
else { /*pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmStatsFragment.renderMegaPokemonStats(megaPokemon);
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmStatsFragment.renderAlolaFormPokemonStats(alolaFormPokemon);
} /*alola form*/
} /*megas*/
} /*pokemon*/
WeaknessFragment pkmWeaknessFragment = (WeaknessFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonDamageTakenFragmentLayout);
if(!isMega && !isAlolan) { /*Pokemon*/
pkmWeaknessFragment.renderPokemonWeakness(pokemon);
} /*Pokemon*/
else { /*Pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmWeaknessFragment.renderMegaPokemonWeakness(megaPokemon);
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmWeaknessFragment.renderAlolaFormPokemonWeakness(alolaFormPokemon);
} /*alola form*/
} /*megas*/
} /*Pokemon*/
BreedingFragment pkmBreedingFragment = (BreedingFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonBreedingFragmentLayout);
if(!isMega && !isAlolan) { /*Pokemon*/
pkmBreedingFragment.renderPokemonBreeding(pokemon);
} /*Pokemon*/
else { /*Pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmBreedingFragment.renderMegaPokemonBreeding(megaPokemon);
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmBreedingFragment.renderAlolaFormPokemonBreeding(alolaFormPokemon);
} /*alola form*/
} /*megas*/
} /*Pokemon*/
TrainingFragment pkmTrainingFragment = (TrainingFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonTrainingFragmentLayout);
if(!isMega && !isAlolan) { /*Pokemon*/
pkmTrainingFragment.renderPokemonTraining(pokemon);
} /*Pokemon*/
else { /*Pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmTrainingFragment.renderMegaPokemonTraining(megaPokemon);
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmTrainingFragment.renderAlolaFormPokemonTraining(alolaFormPokemon);
} /*alola form*/
} /*megas*/
} /*Pokemon*/
EvolutionaryChainFragment pkmEvolutionaryChainFragment = (EvolutionaryChainFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonEvolutionaryChainFragmentLayout);
if(!isMega && !isAlolan) { /*Pokemon*/
pkmEvolutionaryChainFragment.renderPokemonEvolutionaryChain(pokemon);
} /*Pokemon*/
else { /*Pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmEvolutionaryChainFragment.renderMegaPokemonEvolutionaryChain(megaPokemon, pokemon);
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmEvolutionaryChainFragment.renderAlolaFormPokemonEvolutionaryChain(alolaFormPokemon);
} /*alola form*/
} /*megas*/
} /*Pokemon*/
MegaEvolutionFragment pkmMegaEvolutionFragment = (MegaEvolutionFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonMegaEvolutionFragmentLayout);
if(!isMega && !isAlolan) { /*Pokemon*/
pkmMegaEvolutionFragment.renderPokemonMegaEvolution(pokemon);
} /*Pokemon*/
else { /*Pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmMegaEvolutionFragment.renderMegaPokemonMegaEvolution(megaPokemon);
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmMegaEvolutionFragment.renderAlolaFormPokemonMegaEvolution();
} /*alola form*/
} /*megas*/
} /*Pokemon*/
AlolaFormFragment pkmAlolaFormFragment = (AlolaFormFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonAlolaFormFragmentLayout);
if(!isMega && !isAlolan) { /*Pokemon*/
pkmAlolaFormFragment.renderPokemonAlolaForm(pokemon);
} /*Pokemon*/
else { /*Pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmAlolaFormFragment.renderMegaPokemonAlolaForm();
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmAlolaFormFragment.renderMegaPokemonAlolaForm();
} /*alola form*/
} /*megas*/
} /*Pokemon*/
FormsFragment pkmFormsFragment = (FormsFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonFormsFragmentLayout);
if(!isMega && !isAlolan) { /*Pokemon*/
pkmFormsFragment.renderPokemonForms(pokemon);
} /*Pokemon*/
else { /*Pokemon*/
if(isMega && !isAlolan) { /*megas*/
pkmFormsFragment.renderMegaPokemonForms();
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmFormsFragment.renderAlolaFormPokemonForms();
} /*alola form*/
} /*megas*/
} /*Pokemon*/
LocationFragment pkmLocationFragment = (LocationFragment) getSupportFragmentManager()
.findFragmentById(R.id.pokemonLocationFragmentLayout);
if(!isMega && !isAlolan) { /*Pokemon*/
pkmLocationFragment.renderPokemonLocation(pokemon);
} /*Pokemon*/
else { /*Pokemon*/
if (isMega && !isAlolan) { /*megas*/
pkmLocationFragment.renderMegaPokemonLocation();
} /*megas*/
else { /*megas*/
if(!isMega) { /*alola form*/
pkmLocationFragment.renderAlolaFormPokemonLocation(alolaFormPokemon);
} /*alola form*/
} /*megas*/
} /*Pokemon*/
} /*m.getFragments*/
private void toolbar() {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(R.string.toolbar_title_pkm_details);
} /*m.toolbar*/
} //PokemonDetailsActivity
Как получить правильный PokemonDetails при фильтрации списка?