#android #search #android-recyclerview
#Android #Поиск #android-recyclerview
Вопрос:
После поиска элементов RecyclerView в Android всегда открывайте первый элемент RecyclerView Когда я открывал искомый элемент, он открывает первый элемент RecyclerView, а не искомый. Даже если поиск и поиск элементов прошли успешно.
MainActivity.java
public class MainActivityDalil extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private Adapter adapter;
private List<Pets> petsList;
ApiInterface apiInterface;
Adapter.RecyclerViewClickListener listener;
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_dalil);
apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
progressBar = findViewById(R.id.progress);
recyclerView = findViewById(R.id.recyclerView);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
listener = new Adapter.RecyclerViewClickListener() {
@Override
public void onRowClick(View view, final int position) {
Intent intent = new Intent(MainActivityDalil.this, ViewActivity.class);
intent.putExtra("id", petsList.get(position).getId());
intent.putExtra("name", petsList.get(position).getName());
intent.putExtra("species", petsList.get(position).getSpecies());
intent.putExtra("breed", petsList.get(position).getBreed());
intent.putExtra("gender", petsList.get(position).getGender());
intent.putExtra("picture", petsList.get(position).getPicture());
intent.putExtra("birth", petsList.get(position).getBirth());
startActivity(intent);
}
@Override
public void onLoveClick(View view, int position) {
final int id = petsList.get(position).getId();
final Boolean love = petsList.get(position).getLove();
final ImageView mLove = view.findViewById(R.id.love);
if (love){
mLove.setImageResource(R.drawable.likeof);
petsList.get(position).setLove(false);
updateLove("update_love", id, false);
adapter.notifyDataSetChanged();
} else {
mLove.setImageResource(R.drawable.likeon);
petsList.get(position).setLove(true);
updateLove("update_love", id, true);
adapter.notifyDataSetChanged();
}
}
};
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivityDalil.this, EditorActivity.class));
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName())
);
searchView.setQueryHint("Search...");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(final String query) {
adapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
searchMenuItem.getIcon().setVisible(false, false);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
// if (id == R.id.action_settings) {
// return true;
// }
return super.onOptionsItemSelected(item);
}
public void getPets(){
Call<List<Pets>> call = apiInterface.getPets();
call.enqueue(new Callback<List<Pets>>() {
@Override
public void onResponse(Call<List<Pets>> call, Response<List<Pets>> response) {
progressBar.setVisibility(View.GONE);
petsList = response.body();
Log.i(MainActivity.class.getSimpleName(), response.body().toString());
adapter = new Adapter(petsList, MainActivityDalil.this, listener);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call<List<Pets>> call, Throwable t) {
Toast.makeText(MainActivityDalil.this, "rp :"
t.getMessage().toString(),
Toast.LENGTH_SHORT).show();
}
});
}
public void updateLove(final String key, final int id, final Boolean love){
Call<Pets> call = apiInterface.updateLove(key, id, love);
call.enqueue(new Callback<Pets>() {
@Override
public void onResponse(Call<Pets> call, Response<Pets> response) {
Log.i(MainActivity.class.getSimpleName(), "Response " response.toString());
String value = response.body().getValue();
String message = response.body().getMassage();
if (value.equals("1")){
Toast.makeText(MainActivityDalil.this, message, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivityDalil.this, message, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<Pets> call, Throwable t) {
Toast.makeText(MainActivityDalil.this, t.getMessage().toString(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onResume() {
super.onResume();
getPets();
}
}
Customfilter.java
public class CustomFilter extends Filter {
Adapter adapter;
ArrayList<Pets> filterList;
public CustomFilter(ArrayList<Pets> filterList, Adapter adapter)
{
this.adapter=adapter;
this.filterList=filterList;
}
//FILTERING OCURS
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results=new FilterResults();
//CHECK CONSTRAINT VALIDITY
if(constraint != null amp;amp; constraint.length() > 0)
{
//CHANGE TO UPPER
constraint=constraint.toString().toUpperCase();
//STORE OUR FILTERED PLAYERS
ArrayList<Pets> filteredPets=new ArrayList<>();
for (int i=0;i<filterList.size();i )
{
//CHECK
if(filterList.get(i).getName().toUpperCase().contains(constraint))
{
//ADD PLAYER TO FILTERED PLAYERS
filteredPets.add(filterList.get(i));
}
}
results.count=filteredPets.size();
results.values=filteredPets;
}else
{
results.count=filterList.size();
results.values=filterList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
adapter.pets= (ArrayList<Pets>) results.values;
//REFRESH
adapter.notifyDataSetChanged();
}
Adapter.java
public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> implements Filterable {
List<Pets> pets, petsFilter;
private Context context;
private RecyclerViewClickListener mListener;
CustomFilter filter;
public Adapter(List<Pets> pets, Context context, RecyclerViewClickListener listener) {
this.pets = pets;
this.petsFilter = pets;
this.context = context;
this.mListener = listener;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new MyViewHolder(view, mListener);
}
@SuppressLint("CheckResult")
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
holder.mName.setText(pets.get(position).getName());
holder.mType.setText(pets.get(position).getBreed() " / "
pets.get(position).getSpecies());
holder.mDate.setText(pets.get(position).getBirth());
RequestOptions requestOptions = new RequestOptions();
requestOptions.skipMemoryCache(true);
requestOptions.diskCacheStrategy(DiskCacheStrategy.NONE);
requestOptions.placeholder(R.drawable.logo);
requestOptions.error(R.drawable.logo);
Glide.with(context)
.load(pets.get(position).getPicture())
.apply(requestOptions)
.into(holder.mPicture);
final Boolean love = pets.get(position).getLove();
if (love){
holder.mLove.setImageResource(R.drawable.likeon);
} else {
holder.mLove.setImageResource(R.drawable.likeof);
}
}
@Override
public int getItemCount() {
return pets.size();
}
@Override
public Filter getFilter() {
if (filter==null) {
filter=new CustomFilter((ArrayList<Pets>) petsFilter,this);
}
return filter;
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private RecyclerViewClickListener mListener;
private CircleImageView mPicture;
private ImageView mLove;
private TextView mName, mType, mDate;
private RelativeLayout mRowContainer;
public MyViewHolder(View itemView, RecyclerViewClickListener listener) {
super(itemView);
mPicture = itemView.findViewById(R.id.picture);
mName = itemView.findViewById(R.id.name);
mType = itemView.findViewById(R.id.type);
mLove = itemView.findViewById(R.id.love);
mDate = itemView.findViewById(R.id.date);
mRowContainer = itemView.findViewById(R.id.row_container);
mListener = listener;
mRowContainer.setOnClickListener(this);
mLove.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.row_container:
mListener.onRowClick(mRowContainer, getAdapterPosition());
break;
case R.id.love:
mListener.onLoveClick(mLove, getAdapterPosition());
break;
default:
break;
}
}
}
public interface RecyclerViewClickListener {
void onRowClick(View view, int position);
void onLoveClick(View view, int position);
}
}
Чего мне не хватает?