【问题标题】:Update RecyclerView items alphabetically按字母顺序更新 RecyclerView 项目
【发布时间】:2018-04-13 10:39:25
【问题描述】:

我有一个recyclerView,我想按字母顺序对项目进行排序。我使用Collections.sort 对列表进行排序,但是当我尝试使用notifyDatasetChanged() 更新列表时,它显示了无法访问的语句。

这个问题与适配器的范围有关吗?

这是我的 MainActivity:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setToolbar();
        mSort = (TextView) findViewById(R.id.sort);
        // mFilter = (TextView)findViewById(R.id.filter);
        mRecyclerView = (RecyclerView) findViewById(R.id.kictstarterRecycler);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        fetchKickStarter(mRecyclerView);
        setClickListner();
    }

    private void setClickListner() {
        mSort.setOnClickListener(this);
        //mFilter.setOnClickListener(this);
    }

    private void setToolbar() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);

        final MenuItem searchItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        search(searchView);
        return true;
    }

    private void fetchKickStarter(final RecyclerView mRecyclerView) {
        ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
        Call<JsonElement> call = apiService.getKickStarter();
        call.enqueue(new Callback<JsonElement>() {
            @Override
            public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
                Log.d("resonse", response.toString());
                JsonElement object = response.body();
                Type listType = new TypeToken<List<Kickstarter>>() {
                }.getType();
                mKickStarter = new Gson().fromJson(object.getAsJsonArray(), listType);
                mAdapter = new KickstarterAdapter(mKickStarter, R.layout.kickstarter_row_layout, MainActivity.this);
                mRecyclerView.setAdapter(mAdapter);
            }

            @Override
            public void onFailure(Call<JsonElement> call, Throwable t) { }
        });
    }

    @Override
    public void onClick(View view) {
        mSort.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Collections.sort(mKickStarter, new Comparator<Kickstarter>() {
                    @Override
                    public int compare(Kickstarter item1, Kickstarter item2) {
                        return item1.getTitle().compareToIgnoreCase(item2.getTitle());
                        **mAdapter.notifyDataSetChanged()**;
                    }
                });
            }
        });
    }

我很困惑为什么我无法访问mAdapter

【问题讨论】:

  • 什么是 mKickStarter
  • @VineshChauhan 私有列表 mKickStarter,它是一个列表
  • mSort.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Collections.sort(mKickStarter, new Comparator&lt;Kickstarter&gt;() { @Override public int compare(Kickstarter item1, Kickstarter item2) { return item1.getTitle().compareToIgnoreCase(item2.getTitle()); } }); mAdapter.notifyDataSetChanged();} }); 试试这个
  • 我认为@SathishKumar 评论会起作用
  • 您无法调用mAdapter,因为您在return 语句之后调用了语句。

标签: java android android-recyclerview


【解决方案1】:
      @Override
    public void onClick(View view) {
        mSort.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Collections.sort(mKickStarter, new Comparator<Kickstarter>() {
                    @Override
                    public int compare(Kickstarter item1, Kickstarter item2) {
                        return item1.getTitle().compareToIgnoreCase(item2.getTitle());

                    }
                });
            }
        });
       mAdapter.notifyDataSetChanged();
    }

【讨论】:

    【解决方案2】:

    也就是说,你在 return 语句之后调用mAdapter.notifyDataSetChanged()

    Return 语句将在该点返回一个值。当返回值时,代码执行模式也被路由到值接收方法。

    return 之后的so 语句是无法访问的语句。

    试试这个

            @Override
            public void onClick(View view) {
                mSort.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Collections.sort(mKickStarter, new Comparator<Kickstarter>() {
                            @Override
                            public int compare(Kickstarter item1, Kickstarter item2) {
                                return item1.getTitle().compareToIgnoreCase(item2.getTitle());
                            }
                        });
                    }
                    mAdapter.notifyDataSetChanged();
                });
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多