Gelöst, sollte ich statische für meine Modelle in declerating verwenden. danke alleFilter recyclerview mit searchview
Ich ging gerade durch dieses Thema filter recycler view using search view und ich tat alle Schritte. Wenn ich nun in der Recycler-Ansicht suche, wird meine Recycler-Ansicht gefiltert, aber wenn ich die Leerstelle drücke und eine Char entferne, werden die entfernten Elemente nicht angezeigt! Meine Recycler-Ansicht ist nach der Suche ebenfalls leer.
Das ist mein RecyclerView Adapter:
package com.webapp.masoud.application.myRecyclerAdapter;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import com.webapp.masoud.application.R;
import com.webapp.masoud.application.service.NewsModel;
import java.util.ArrayList;
import de.hdodenhof.circleimageview.CircleImageView;
public class myRecyclerAdapter extends RecyclerView.Adapter<myRecyclerAdapter.myRecyclerViewHolder> {
private Context context;
ArrayList<NewsModel> myModels;
public myRecyclerAdapter(Context context, ArrayList<NewsModel> myModels) {
this.context = context;
this.myModels = myModels;
}
@Override
public myRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.channels_layout, parent, false);
return new myRecyclerViewHolder(v);
}
@Override
public void onBindViewHolder(myRecyclerViewHolder holder, int position) {
final NewsModel newsModel = myModels.get(position);
holder.edt_Title.setText(newsModel.title);
holder.edt_Dis.setText(newsModel.discription);
holder.txt_Category.setText(newsModel.category);
Picasso.with(context).load(newsModel.image).into(holder.img_Channel);
holder.btn_Join.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String username;
if (newsModel.username.startsWith("@")){
username = "http://telegram.me/" + newsModel.username.substring(1);
}
else{
username = "http://telegram.me/" + newsModel.username;}
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(username));
context.startActivity(i);
}
});
}
@Override
public int getItemCount() {
return myModels.size();
}
public void animateTo(ArrayList<NewsModel> models) {
applyAndAnimateRemovals(models);
applyAndAnimateAdditions(models);
applyAndAnimateMovedItems(models);
}
public void setModels(ArrayList<NewsModel> models) {
myModels = new ArrayList<>(models);
}
public NewsModel removeItem(int position) {
final NewsModel model = myModels.remove(position);
notifyItemRemoved(position);
return model;
}
public void addItem(int position, NewsModel model) {
myModels.add(position, model);
notifyItemInserted(position);
}
public void moveItem(int fromPosition, int toPosition) {
final NewsModel model = myModels.remove(fromPosition);
myModels.add(toPosition, model);
notifyItemMoved(fromPosition, toPosition);
}
private void applyAndAnimateRemovals(ArrayList<NewsModel> newModels) {
for (int i = myModels.size() - 1; i >= 0; i--) {
final NewsModel model = myModels.get(i);
if (!newModels.contains(model)) {
removeItem(i);
}
}
}
private void applyAndAnimateAdditions(ArrayList<NewsModel> newModels) {
for (int i = 0, count = newModels.size(); i < count; i++) {
final NewsModel model = newModels.get(i);
if (!myModels.contains(model)) {
addItem(i, model);
}
}
}
private void applyAndAnimateMovedItems(ArrayList<NewsModel> newModels) {
for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) {
final NewsModel model = newModels.get(toPosition);
final int fromPosition = myModels.indexOf(model);
if (fromPosition >= 0 && fromPosition != toPosition) {
moveItem(fromPosition, toPosition);
}
}
}
class myRecyclerViewHolder extends RecyclerView.ViewHolder {
private TextView edt_Title;
private TextView edt_Dis;
public TextView txt_Category;
private Button btn_Join;
private CircleImageView img_Channel;
public myRecyclerViewHolder(View itemView) {
super(itemView);
edt_Title = (TextView) itemView.findViewById(R.id.edt_Title);
edt_Dis = (TextView) itemView.findViewById(R.id.edt_Dis);
btn_Join = (Button) itemView.findViewById(R.id.btn_Join);
img_Channel = (CircleImageView) itemView.findViewById(R.id.img_Channel);
txt_Category = (TextView) itemView.findViewById(R.id.txt_Category);
}
}
}
Das ist mein MainActivity.java:
package com.webapp.masoud.application.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Parcelable;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.webapp.masoud.application.R;
import com.webapp.masoud.application.myRecyclerAdapter.myRecyclerAdapter;
import com.webapp.masoud.application.service.NewsModel;
import com.webapp.masoud.application.service.APIService;
import com.webapp.masoud.application.service.NewsModelResponse;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import uk.co.chrisjenx.calligraphy.CalligraphyConfig;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;
public class MainActivity extends AppCompatActivity {
private SearchView mSearchView;
private MenuItem searchMenuItem;
RecyclerView rv_Channels;
private Parcelable recyclerViewState;
SearchView.OnQueryTextListener myListener;
myRecyclerAdapter myAdapter;
ArrayList<NewsModel> newsModelArrayList;
NewsModelResponse newsModelResponse;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//CalliGraphy
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/Vazir.ttf")
.setFontAttrId(R.attr.fontPath)
.build()
);
//Context
setContentView(R.layout.activity_main);
//MY Application
Toolbar myToolbar = (Toolbar) findViewById(R.id.myToolbar);
setSupportActionBar(myToolbar);
final ProgressDialog myProgressDialog = new ProgressDialog(MainActivity.this);
myProgressDialog.setMessage("در حال دریافت لیست کانال ها ، لطفا منتظر بمانید .");
rv_Channels = (RecyclerView) findViewById(R.id.rv_Channels);
final SearchView sv_Channels = (SearchView) findViewById(R.id.sv_Channels);
//My API Service !
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://rapcity1.cf/service/")
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService service = retrofit.create(APIService.class);
Call<NewsModelResponse> serviceNewsModels = service.getNewsModels();
serviceNewsModels.enqueue(new Callback<NewsModelResponse>() {
@Override
public void onResponse(Call<NewsModelResponse> call, Response<NewsModelResponse> response) {
myProgressDialog.dismiss();
newsModelResponse = response.body();
newsModelArrayList = newsModelResponse.getNewsModels();
myAdapter = new myRecyclerAdapter(MainActivity.this, newsModelArrayList);
LinearLayoutManager myLinearlayoutmanager = new LinearLayoutManager(MainActivity.this);
rv_Channels.setLayoutManager(myLinearlayoutmanager);
recyclerViewState = rv_Channels.getLayoutManager().onSaveInstanceState();//save
rv_Channels.setItemAnimator(new DefaultItemAnimator());
rv_Channels.setAdapter(myAdapter);
}
@Override
public void onFailure(Call<NewsModelResponse> call, Throwable t) {
}
});
//End of API Service
//Search
assert sv_Channels != null;
myListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
final ArrayList<NewsModel> filteredModelList = filter(newsModelArrayList, query);
myAdapter.animateTo(filteredModelList);
rv_Channels.scrollToPosition(0);
return true;
}
};
}
private ArrayList<NewsModel> filter(ArrayList<NewsModel> models, String query) {
// query = query.toLowerCase();
final ArrayList<NewsModel> filteredModelList = new ArrayList<>();
for (NewsModel model : models) {
final String title = model.title;
//final String dis = model.discription;
if (title.contains(query) /*|| dis.contains(query)*/) {
filteredModelList.add(model);
}
}
return filteredModelList;
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
searchMenuItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) searchMenuItem.getActionView();
mSearchView.setOnQueryTextListener(myListener);
mSearchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
rv_Channels.getLayoutManager().onRestoreInstanceState(recyclerViewState);
return true;
}
});
return true;
}
}
Das ist mein newsModels:
package com.webapp.masoud.application.service;
import java.io.Serializable;
/**
* Created by Master on 4/19/2016.
*/
public class NewsModel implements Serializable {
public String id;
public String title;
public String discription;
public String image;
public String category;
public String username;
public NewsModel(String title, String description,String image,String id,String category,String username) {
this.id = id;
this.title = title;
this.discription = description;
this.image = image;
this.category = category;
this.username=username;
}
public NewsModel() {
}
}
Bitte helfen Sie mir, danke. Entschuldigung für mein schlechtes Englisch!
versuchte nicht funktioniert :(Bitte helfen Sie mir. PS: Im mit RetroFit 2. –