【问题标题】:How to clear the recyclerview / adapter in searchview for next search android如何清除searchview中的recyclerview/适配器以进行下一次搜索android
【发布时间】:2019-07-09 09:41:06
【问题描述】:

我正在使用改造来搜索图像和显示。我正在使用 SearchView 来搜索和 recyclerview 和适配器来显示项目。

这是第一次工作。第二次搜索时,它显示的是相同的项目。它不会清除要显示的视图。

这是我的代码:

    public class MainActivity extends AppCompatActivity {
        private static final String TAG = MainActivity.class.getName();
        ImagesViewModel newsViewModel;
        List<Hits> newsArticles;
        List<Hits> articleArrayList;
        ImagesAdapter newsAdapter;
        RecyclerView rvHeadline;
        SearchView searchView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            rvHeadline = (RecyclerView) findViewById(R.id.rvNews);
            searchView=(SearchView) findViewById(R.id.searchView);
            searchView.setQueryHint("Search Images");
            searchView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    searchView.setIconified(false);
                }
            });
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

                @Override
                public boolean onQueryTextSubmit(String query) {
                    callPixabayImages(query);
                    Toast.makeText(getBaseContext(), query, Toast.LENGTH_LONG).show();
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    callPixabayImages(newText);
                    Toast.makeText(getBaseContext(), newText, Toast.LENGTH_LONG).show();
                    return false;
                }
            });
            articleArrayList = new ArrayList<>();
 }

 private void callPixabayImages(String query){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ImageApiInterface.PIXABAY_URL)
                .addConverterFactory(GsonConverterFactory.create()) //Here we are using the GsonConverterFactory to directly convert json data to object
                .build();

        ImageApiInterface api = retrofit.create(ImageApiInterface.class);

        Call<MyImages> call = api.getMovieDetails(query);
        call.enqueue(new Callback<MyImages>() {
            @Override
            public void onResponse(Call<MyImages> call, Response<MyImages> response) {
                Log.e("response","response"+response.code());
                if(response.isSuccessful()){
                    Log.e("response","response"+response.code());
                    if((response.body() != null ? response.body().getHits() : null) !=null){
                        List<Hits> imagesList = response.body().getHits();
                        articleArrayList.addAll(imagesList);
                      newsAdapter.notifyDataSetChanged();
                    }
                }



            }

            @Override
            public void onFailure(Call<MyImages> call, Throwable t) {
                System.out.println("Error: "+ t.getMessage());
                Log.e("response","response"+t);
            }
        });

    }
 private void setupRecyclerView() {
        if (newsAdapter == null) {
            newsAdapter = new ImagesAdapter(MainActivity.this, articleArrayList);

            rvHeadline.setLayoutManager(new LinearLayoutManager(this));
            rvHeadline.setAdapter(newsAdapter);
            rvHeadline.setItemAnimator(new DefaultItemAnimator());
            rvHeadline.setNestedScrollingEnabled(true);
        } else {
            newsAdapter.notifyDataSetChanged();
        }
    }

在这里我需要重置以搜索新项目以避免显示上一个项目。列表未清除以显示新项目。

这是适配器类:

public class ImagesAdapter extends RecyclerView.Adapter<ImagesAdapter.NewsViewHolder> {
    private Context context;
    private List<Hits> articles;

    public ImagesAdapter(Context context, List<Hits> articles) {
        this.context = context;
        this.articles = articles;
    }

    @NonNull
    @Override
    public ImagesAdapter.NewsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.images_item, parent, false);
        return new NewsViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ImagesAdapter.NewsViewHolder holder, final int position) {
        String image = articles.get(position).getLargeImageURL();
        Log.e("imagestest",image);
        if (image != null) {
            Glide.with(context) //passing context
                    .load(image) //passing your url to load image.
                    .dontAnimate()
                    .placeholder(context.getDrawable(R.drawable.image_not_available)) //this would be your default image (like default profile or logo etc). it would be loaded at initial time and it will replace with your loaded image once glide successfully load image using url.
                    //.centerCrop()//this method help to fit image into center of your ImageView
                    .into(holder.ivNews); //pass imageView reference to appear the image.*/
        }
    }

    @Override
    public int getItemCount() {
        return articles.size();
    }

    class NewsViewHolder extends RecyclerView.ViewHolder {

        ImageView ivNews;
        private NewsViewHolder(@NonNull View itemView) {
            super(itemView);
            ivNews = itemView.findViewById(R.id.ivNews);

        }
    }
}

我不知道究竟在哪里需要清除视图以获取新搜索的项目。

试用 1:我试图清除列表对象 articleArrayList,但它会引发适配器大小为空的崩溃。

【问题讨论】:

    标签: java android android-layout android-recyclerview retrofit2


    【解决方案1】:

    清洁

    文章数组列表

    在再次加载搜索项目之前......通过执行此行articleArrayList.clear();

    public void onResponse(Call<MyImages> call, Response<MyImages> response) {
                        Log.e("response","response"+response.code());
                        if(response.isSuccessful()){
                            Log.e("response","response"+response.code());
                            if((response.body() != null ? response.body().getHits() : null) !=null){
                                List<Hits> imagesList = response.body().getHits();
    
                                articleArrayList.clear();
    
                              articleArrayList.addAll(imagesList);
                                newsAdapter.notifyDataSetChanged();
                            }
                        }
    

    【讨论】:

    • 我使用了这个,但它没有在列表中显示任何内容。没有崩溃,但列表不显示任何内容。
    • 然后调试每一行或记录每一行以查看代码的确切值和缺陷。
    • 对不起。谢谢哥们。在职的。知道了。当时网络断了。我没有注意到。现在它正在工作。
    【解决方案2】:

    您将生成的imagesList 添加到articleArrayList,您应该替换这些值。

    articleArrayList = imagesList;
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多