如何通过最低数量/stringandroid studiosortingrecylerview

我在我的应用程序中有一个recylerview,它包含两个textview,一个是rankTextView,另一个是nameTextview。 像这样的东西;

在这里输入图像说明

我想要做的是对这个rec​​ylerview进行sorting,首先以最小的顺序进行sorting,如果有两个相同的数字,那么我希望它通过string进行sorting。 在上面的截图中,我举例说,两个人排名第一,首先我要recylerview把这些放在最前面,然后用String来sorting。

我已经在网上search,看看我怎么能做到这一点,但是对于android来说,我还没有能够把这些发现融入到我的项目中去。 例如;

如何在Android RecyclerView上对string进行sorting?

什么是SortedList <T>与RecyclerView.Adapter一起工作?

我已经创build了一个自定义的适配器,其中包含一个名为rankTextview的textview和另一个名为nameTextview的textview,就像这样;

rankTextview = (TextView) itemView.findViewById(R.id.ranktextview); nameTextview = (TextView) itemView.findViewById(R.id.nametextview); 

那么我有一个方法,把这些textview作为参数放入什么值,就像这样;

  public addPerson(String rankTextview, String personTextview,) { this.rankTextview = rankTextview; this.personTextview = personTextview; } 

然后我在我的主类中调用这个方法来添加数据,就像这样;

 person.add(new addPerson ("1\nrank", "James Kub")); person.add(new addPerson ("2\nrank", "Peter Hanly")); person.add(new addPerson ("3\nrank", "Josh Penny")); person.add(new addPerson ("1\nrank", "Danny Jackson")); person.add(new addPerson ("3\nrank", "Brad Black")); 

现在我想要做的就是按照排名最低的顺序排列这些数据,例如1,2,3 ……如果有两个相同的数字,那么我想按名称字母顺序sorting。 此外,将来我的应用程序将包含积分,而不是像这样的十进制数。 1.1,1.5,1.1,2.1,2.5等等,所以按排名sorting时,可能会计入十进制数。

如果我的问题不够清楚,请提前致谢。 另外,由于我有这么多的代码行,我不知道哪个部分提供,哪些不提供,请让我知道是否有任何代码我失踪,我应该包括在内。

编辑:

 public void animateTo(List<ExampleModel> models) { applyAndAnimateRemovals(models); applyAndAnimateAdditions(models); applyAndAnimateMovedItems(models); } private void applyAndAnimateRemovals(List<ExampleModel> newModels) { for (int i = mModels.size() - 1; i >= 0; i--) { final ExampleModel model = mModels.get(i); if (!newModels.contains(model)) { removeItem(i); } } } private void applyAndAnimateAdditions(List<ExampleModel> newModels) { for (int i = 0, count = newModels.size(); i < count; i++) { final ExampleModel model = newModels.get(i); if (!mModels.contains(model)) { // error here, saying cannot resolve method contains addItem(i, model); } } } private void applyAndAnimateMovedItems(List<ExampleModel> newModels) { for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) { final ExampleModel model = newModels.get(toPosition); final int fromPosition = mModels.indexOf(model); if (fromPosition >= 0 && fromPosition != toPosition) { moveItem(fromPosition, toPosition); } } } public ExampleModel removeItem(int position) { final ExampleModel model = mModels.remove(position); // Error here, saying in sortedlist cannot be applied to (int) notifyItemRemoved(position); return model; } public void addItem(int position, ExampleModel model) { mModels.add(position, model); // Error here, saying add has private access in 'android.support.v7.util.SortedList' notifyItemInserted(position); } public void moveItem(int fromPosition, int toPosition) { final ExampleModel model = mModels.remove(fromPosition); // Error here, saying in sortedlist cannot be applied to (int) mModels.add(toPosition, model); // Error here, saying add has private access in 'android.support.v7.util.SortedList' notifyItemMoved(fromPosition, toPosition); } 

Solutions Collecting From Web of "如何通过最低数量/stringandroid studiosortingrecylerview"

RecyclerView有一些实现sorting的选项。 当然可以依赖Comparable<T>Comparator<T>接口,但正如你所提到的,也可以利用Android SDK中定义的SortedList<T>类。

SortedList<T>用途是简化RecyclerView中元素的sorting,使您可以拦截“添加新项目”,“删除项目”等显着事件。

在你的情况下,你可以进行如下:

  1. 定义一个Person类来包装等级和名称。 请注意,在这个版本中,我假设有秩的整数值,但移动到十进制值是很容易的。

     class Person { private String rank; private String name; public Person(String rank, String name) { this.rank = rank; this.name = name; } // getters and setters here } 
  2. 定义一个Activity来构buildRecyclerView和相应的适配器。 在这个例子中,我已经包含一个FloatingActionButton插入新的随机人员。 正如你所看到的,当创build一个新的Person ,在适配器上调用方法addPerson 。 它的作用是更新RecyclerView ,根据适配器内部定义的标准对它进行sorting(见第3点)。

     public class SortPersonsActivity extends AppCompatActivity { private List<Person> mPersons; private SortPersonsAdapter mPersonsAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_persons_list); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); mPersons = new ArrayList<>(); mPersons.add(new Person("1\nrank", "James Kub")); mPersons.add(new Person("2\nrank", "Peter Hanly")); mPersons.add(new Person("3\nrank", "Josh Penny")); mPersons.add(new Person("1\nrank", "Danny Jackson")); mPersons.add(new Person("3\nrank", "Brad Black")); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.lst_items); recyclerView.setLayoutManager(getLayoutManager()); mPersonsAdapter = new SortPersonsAdapter(this, mPersons); recyclerView.setAdapter(mPersonsAdapter); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // building new fake person Person person = new Person( buildRandomInt(10) + "\nrank", buildRandomName(5) + " " + buildRandomName(5)); // let's keep also basic list updated mPersons.add(person); // let's update adapter mPersonsAdapter.addPerson(person); } }); } private RecyclerView.LayoutManager getLayoutManager() { LinearLayoutManager llm = new LinearLayoutManager(this); llm.setOrientation(LinearLayoutManager.VERTICAL); return llm; } // support method for random names and ranks here } 
  3. 依靠SortedList<Person>实现一个RecyclerView适配器。 这里需要注意的是,所有的人都被插入到一个SortedList<Person> 。 创build一个SortedList<T>需要定义一个Callback来拦截事件以及定义sorting标准。 在我们的例子中,正如你所看到的, compare方法定义了sortingPersons的标准,而onInserted方法定义了当插入一个新Person(在这种情况下通知一个更新RecyclerView的数据集更改)时要做什么。 请注意在第2点描述的addPerson方法的实现。它只是将一个Person添加到SortedList ,因为更新RecyclerView的逻辑被embedded到前面提到的Callback方法onInserted中。

     class SortPersonsAdapter extends RecyclerView.Adapter<SortPersonsAdapter.PersonViewHolder> { protected static class PersonViewHolder extends RecyclerView.ViewHolder { View layout; TextView txt_rank; TextView txt_full_name; public PersonViewHolder(View itemView) { super(itemView); layout = itemView; txt_rank = (TextView) itemView.findViewById(R.id.txt_rank); txt_full_name = (TextView) itemView.findViewById(R.id.txt_full_name); } } private Context mContext; private LayoutInflater mLayoutInflater; private SortedList<Person> mPersons; public SortPersonsAdapter(Context context, List<Person> persons) { mContext = context; mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mPersons = new SortedList<>(Person.class, new PersonListCallback()); mPersons.addAll(persons); } public void addPerson(Person person) { mPersons.add(person); } @Override public int getItemCount() { return mPersons.size(); } @Override public SortPersonsAdapter.PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = mLayoutInflater.inflate(R.layout.view_person_item, parent, false); return new PersonViewHolder(itemView); } @Override public void onBindViewHolder(final PersonViewHolder viewHolder, final int position) { Person person = mPersons.get(position); viewHolder.txt_rank.setText(person.getRank()); viewHolder.txt_full_name.setText(person.getName()); } /** * Implementation of callback for getting updates on person list changes. */ private class PersonListCallback extends SortedList.Callback<Person> { @Override public int compare(Person p1, Person p2) { String[] rank1 = p1.getStringRank().split("\n"); String[] rank2 = p2.getStringRank().split("\n"); int diff = Integer.parseInt(rank1[0]) - Integer.parseInt(rank2[0]); return (diff == 0) ? p1.getName().compareTo(p2.getName()) : diff; } @Override public void onInserted(int position, int count) { notifyItemInserted(position); } @Override public void onRemoved(int position, int count) { notifyItemRemoved(position); } @Override public void onMoved(int fromPosition, int toPosition) { } @Override public void onChanged(int position, int count) { } @Override public boolean areContentsTheSame(Person oldItem, Person newItem) { return false; } @Override public boolean areItemsTheSame(Person item1, Person item2) { return false; } } } 

希望这可以帮助。 在这里我已经为你的RecyclerView了一个实现,以防你需要更多的代码细节。

 public int compare(Person p1, Person p2) { if(p1.getRank() == p2.getRank()){ return p1.getName().compareTo(p2.getName()); }else if(p1.getRank() > p2.getRank()){ return 1; }else{ return -1; } } 

sorting依赖于返回比较结果。 您需要返回-11 。 在代码片段中,我所做的只是首先检查队列。 如果他们是相同的排名,我比较他们的名字是String和每个String有一个compareTo( )字典对比两个string。

如果不是的话,我们就根据等级sorting。

您可以通过使Person类实现Comparable接口来进一步简化您的compare( )方法。 这将允许你使用开箱即用的框架。