java - 绑定视图持有人不在适配器中运行
问题描述
我有一个奇怪的问题。我想在RecyclerView
. 我将一个列表传递给适配器以显示。在适配器的构造函数中,设置了列表,但没有调用其他方法。在我调试时,列表已设置,但没有其他任何反应,也不会显示任何内容
这是我的适配器代码:
public class SearchItemAdapter extends RecyclerView.Adapter<SearchItemAdapter.SearchViewHolder> {
List<Product> products;
public SearchItemAdapter(){
products=new ArrayList<>();
}
@NonNull
@Override
public SearchViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.search_item,viewGroup,false);
return new SearchViewHolder(view);
}
public void onbind(List<Product> products){
this.products=products;
notifyDataSetChanged();
}
@Override
public void onBindViewHolder(@NonNull SearchViewHolder searchViewHolder, int i) {
Product product= products.get(i);
Picasso.get().load(product.getPic()).into(searchViewHolder.image);
searchViewHolder.txtTitle.setText(product.getTitle());
searchViewHolder.txtDesc.setText(product.getTitle());
}
@Override
public int getItemCount() {
return products.size();
}
public class SearchViewHolder extends RecyclerView.ViewHolder {
ImageView image;
TextView txtTitle,txtDesc;
public SearchViewHolder(@NonNull View itemView) {
super(itemView);
txtTitle=itemView.findViewById(R.id.txt_searchItem_title);
txtDesc=itemView.findViewById(R.id.txt_searchItem_desc);
image=itemView.findViewById(R.id.img_searchItem_image);
}
}
}
和活动代码:
public class CompareSearchActivity extends AppCompatActivity {
CompareViewModel viewModel=new CompareViewModel();
CompositeDisposable compositeDisposable=new CompositeDisposable();
EditText edtSearch;
ProgressBar progressBar;
ImageView imgClose;
RecyclerView recyclerView;
SearchItemAdapter searchItemAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compare_search);
setupViews();
}
private void setupViews() {
recyclerView=findViewById(R.id.rv_compareSearch_searchedProduct);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
searchItemAdapter=new SearchItemAdapter();
recyclerView.setAdapter(searchItemAdapter);
imgClose=findViewById(R.id.img_compareSearch_close);
imgClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
edtSearch=findViewById(R.id.edt_compareSearch_serach);
edtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
viewModel.getSearchedProduct(String.valueOf(s))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<List<Product>>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}
@Override
public void onSuccess(List<Product> products) {
progressBar.setVisibility(View.GONE);
searchItemAdapter.onbind(products);
}
@Override
public void onError(Throwable e) {
Log.i("LOG", "onError: "+e.toString());
}
});
}
@Override
public void afterTextChanged(Editable s) {
}
});
progressBar=findViewById(R.id.progress_compareSearch);
}
}
解决方案
你忘记了 RecyclerView 来设置适配器
recyclerView.setAdapter(searchItemAdapter);
并更改代码以及如下所示
public void onbind(List<Product> products){
this.products.clear();
this.products.addAll(products);
notifyDataSetChanged();
}
如下设置适配器
private void setupViews() {
recyclerView=findViewById(R.id.rv_compareSearch_searchedProduct);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
searchItemAdapter=new SearchItemAdapter();
// Here is the adapter
recyclerView.setAdapter(searchItemAdapter);
imgClose=findViewById(R.id.img_compareSearch_close);
imgClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
edtSearch=findViewById(R.id.edt_compareSearch_serach);
edtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
viewModel.getSearchedProduct(String.valueOf(s))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<List<Product>>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}
@Override
public void onSuccess(List<Product> products) {
progressBar.setVisibility(View.GONE);
searchItemAdapter.onbind(products);
}
@Override
public void onError(Throwable e) {
Log.i("LOG", "onError: "+e.toString());
}
});
}
@Override
public void afterTextChanged(Editable s) {
}
});
progressBar=findViewById(R.id.progress_compareSearch);
}
}
推荐阅读
- python - 估计文本文件中值的函数
- jquery - 使用 Asp.net Core MVC Bootstrap 4,对于服务器端添加的模型状态错误,我无法让不显眼的验证正常工作
- linux - 如何使用 cURL 发布请求将文件内容作为数据原始有效负载中的字符串发送
- python - 根据多索引的级别过滤选择值
- postgresql-11 - Azure PostgreSQL 的 Azure DevOps
- android - 在 Android 应用程序上运行检测时获取 ClassNotFoundException
- php - 会议邀请未显示在我的日历中
- racket - 如何解决“未绑定标识符错误:球拍”
- php - Laravel 8图像未显示
- flutter - 提供程序在执行时未更新,Navigator.pop(context) 在颤动