【问题标题】:How to sort recyclerView right如何对recyclerView进行排序
【发布时间】:2018-02-19 19:09:12
【问题描述】:

我创建了一个recyclerView(见这张图片)

但我没有得到我想要的结果。我需要这个:

你看我已经对职业进行了分组,所有职业都有自己的图标。所以我现在将包含我的recyclerView 代码。我该怎么做?如果我做错了什么,请告诉我,不要投反对票。

这是项目类。

public class Rec_Items {

    private int image;
    private String fullName;
    private String profession;

    public Rec_Items(int image, String fullName, String profession) {
        this.image = image;
        this.fullName = fullName;
        this.profession = profession;
    }

    public int getImage() {
        return image;
    }

    public String getFullName() {
        return fullName;
    }

    public String getProfession() {
        return profession;
    }
}

现在这里是 adapter 和它的 ViewHolder

public class SupportersAdapter extends RecyclerView.Adapter<SupportersAdapter.MyViewHolder> {

    Context context;
    List<Supporters_item> list = new ArrayList<>();

    public SupportersAdapter(Context context, List<Supporters_item> list) {
        this.context = context;
        this.list = list;
    }


    @Override
    public SupportersAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;
        v = LayoutInflater.from(context).inflate(R.layout.supporters_view_item, parent, false);
        MyViewHolder holder = new MyViewHolder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(SupportersAdapter.MyViewHolder holder, int position) {
        holder.imageView.setImageResource(list.get(position).getImage());
        holder.fullName.setText(list.get(position).getFullName());
        holder.profession.setText(list.get(position).getProfession());

        if (list.get(position).getProfession().equals("Actress")) {
            holder.icon.setImageResource(R.drawable.medical);
        }
        if (list.get(position).getProfession().equals("Builder")) {
            holder.icon.setImageResource(R.drawable.builderkey);
        }
        if (list.get(position).getProfession().equals("Designer")) {
            holder.icon.setImageResource(R.drawable.shopping);
        }
        if (list.get(position).getProfession().equals("Programmer")) {
            holder.icon.setImageResource(R.drawable.education);
        }

        if (position > 0) {
            if (!list.get(position).getProfession().substring(0,1).equals(list.get(position-1).getProfession().substring(0, 1))) {
                holder.view.setVisibility(View.VISIBLE);
                holder.icon.setVisibility(View.VISIBLE);
            }
        }

    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {

        ImageView imageView, icon;
        TextView fullName, profession;
        View view;

        public MyViewHolder(View itemView) {
            super(itemView);

            imageView = (ImageView) itemView.findViewById(R.id.support_picture);
            fullName = (TextView) itemView.findViewById(R.id.fName);
            profession = (TextView) itemView.findViewById(R.id.profession);
            icon = (ImageView) itemView.findViewById(R.id.icon);
            view = itemView.findViewById(R.id.bottomLine);

        }
    }
}

我已经完成了onBindViewHolder() 的小组部分,所以请注意,我得到的不是我想要的结果,我想要的是图像结果。

这是MainActivity 类。

public class MainActivity extends AppCompatActivity {

    private List<Rec_Items> list;
    private RecyclerView recyclerView;

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

        recyclerView = (RecyclerView) findViewById(R.id.supporters_recycler);
        add();
        Adapter adapter = new Adapter(this, list);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

    }

    public void add(){
        list = new ArrayList<>();
        list.add(new Rec_Items(R.drawable.pfl_img, "Name Surname", "Actress"));
        list.add(new Rec_Items(R.drawable.pfl_img, "Name Surname", "Programmer"));
        list.add(new Rec_Items(R.drawable.pfl_img, "Name Surname", "Builder"));
        list.add(new Rec_Items(R.drawable.pfl_img, "Name Surname", "Designer"));
        list.add(new Rec_Items(R.drawable.pfl_img, "Name Surname", "Actress"));
        list.add(new Rec_Items(R.drawable.pfl_img, "Name Surname", "Programmer"));
        list.add(new Rec_Items(R.drawable.pfl_img, "Name Surname", "Builder"));
        list.add(new Rec_Items(R.drawable.pfl_img, "Name Surname", "Designer"));
    }
}

我如何修改我的代码,为了获得分组 recyclerView 要更改什么?

【问题讨论】:

标签: java android android-recyclerview


【解决方案1】:

您可以在设置适配器之前按专业字母顺序对列表进行排序:

List<Rec_Items> sortedList = new ArrayList();
if (list.size() > 0) {
    Collections.sort(list, new Comparator<Rec_Items>() {
        @Override
        public int compare(final Rec_Items object1, final Rec_Items object2) {
            return object1.getProfession().compareTo(object2.getProfession());
        }
    });
}

//                                  SORTED LIST
Adapter adapter = new Adapter(this, sortedList);

要在每个部分显示除数(线),可以在xml设计上添加为gone android:visibility="gone",如果上一个项目职业的首字母与当前不同,则显示:

//Inside onBindViewHolder method:
if(position > 0){
        // [----------------PREVIOUS ITEM-----------------]       [------------------CURRENT ITEM------------------]
    if(!list.get(position-1).getProfession().substring(0,1).equals(list.get(position).getProfession().substring(0,1))){
        //Example: holder.getDivisor().setVisibility(View.VISIBLE);
    }
}

对于图标部分,你可以使用相同的逻辑。让它隐藏在xml设计中,如果item是列表中的第一个,或者前一个item职业的首字母不同,即当前item是它所在section的第一个,就显示出来。您可以查看职业名称来设置对应的图像。

编码愉快!

【讨论】:

  • 好的,谢谢,明天我想我可以做到这一点))在我们地区现在晚上)))
  • 我已经完成了,但这不是我例外的工作。我怎样才能把图片发给你?
  • 嘿,Hayk,很高兴你成功了!事情是这样的:在 xml 中,您可能包括专业名称下方的除数。您需要将其包含在布局的顶部。您还需要在列表的第一个元素中显示图标。只需检查位置是否为零并显示图像。
  • 我为我的问题添加了答案。您可以在下面看到解决方案。
【解决方案2】:

解决办法

@Override
public void onBindViewHolder(SupportersAdapter.MyViewHolder holder, int position) {
    holder.imageView.setImageResource(list.get(position).getImage());
    holder.fullName.setText(list.get(position).getFullName());
    holder.profession.setText(list.get(position).getProfession());

    //call button listener
    holder.buttonCall.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(context, "Whom you wanna call?", Toast.LENGTH_SHORT).show();
        }
    });

    //setting icons for each profession
    if (list.get(position).getProfession().equals("Actress")) {
        holder.icon.setImageResource(R.drawable.medical);
    }
    if (list.get(position).getProfession().equals("Builder")) {
        holder.icon.setImageResource(R.drawable.spanner);
    }
    if (list.get(position).getProfession().equals("Designer")) {
        holder.icon.setImageResource(R.drawable.shopping);
    }
    if (list.get(position).getProfession().equals("Programmer")) {
        holder.icon.setImageResource(R.drawable.education);
    }

    //setting first icon always visible
    if (position == 0) {
        holder.icon.setVisibility(View.VISIBLE);
    }

    //setting bottom view visible for dividing
    if (position + 1 < getItemCount()) {
        if (!list.get(position).getProfession().substring(0, 1).equals
                (list.get(position + 1).getProfession().substring(0, 1))) {
            holder.view.setVisibility(View.VISIBLE);
        }
    }

    //setting icon visible for group of profession
    if (position > 0) {
        if (!list.get(position).getProfession().substring(0, 1).equals
                (list.get(position - 1).getProfession().substring(0, 1))) {
            holder.icon.setVisibility(View.VISIBLE);
        }
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 2023-03-14
    • 2015-12-01
    • 2022-01-15
    • 2021-06-13
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多