java - 如何对 recyclerView 进行分组,在组之间添加分隔线并为每个组添加一个图标

标签 java android sorting android-recyclerview

我需要像这样创建recyclerView:

enter image description here

我创建了我的recyclerView,完成了组,添加了分隔线和图标,但结果不正确。所以我得到了这个:

enter image description here

这不是我想要的结果。那么让我向您展示源代码。

public class Supporters_item {

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

public Supporters_item(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;
}}

这是项目部分。我认为这里没有必要。

现在这是适配器。

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) {
        holder.icon.setVisibility(View.VISIBLE);
    }
    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
    implements FragmentChangeListener, TabLayoutLocationInterface {
SlidePageTabsMainFragment slidePageTabsMainFragment;
MainFragment mainFragment;
FragmentLanguage fragmentLanguage;

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

    ApiClient.initializeInstance("https://supportop.eu-gb.mybluemix.net/");

    slidePageTabsMainFragment = new SlidePageTabsMainFragment();
    mainFragment = new MainFragment();
    fragmentLanguage = new FragmentLanguage();

    this.replaceFragment(slidePageTabsMainFragment, true);

    SharedPreferencesManager.init(this);
}

@Override
public void replaceFragment(BaseFragment fragment, Boolean isAddToBackStack) {
    String backStateName = fragment.getClass().getName();
    FragmentManager manager = getFragmentManager();

    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.main_fragment_container, fragment, fragment.toString());
    transaction.addToBackStack(backStateName);
    transaction.commit();
}

@Override
public int getTabLayoutLocation() {
    SlidePageTabsMainFragment slidePageTabsMainFragment = (SlidePageTabsMainFragment)
            getFragmentManager().findFragmentByTag("SlidePageTabsMainFragment");
    return slidePageTabsMainFragment.getTabLayoutLocation();
}

//fragments back press part
@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 1) {
        finish();
    } else if (getFragmentManager().getBackStackEntryCount() >= 5) {
        if (fragmentLanguage != null) {
            getFragmentManager().popBackStack(fragmentLanguage.getClass().getName(),
                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    } else {
        super.onBackPressed();
    }
}}

最佳答案

您正在为单个 ViewHolderholder 的一个条件 block 中设置 holder.viewholder.icon 的可见性。 viewholder.icon 可见性将在 2 个连续的 ViewHolder 之间发生变化。

示例:如果行索引 3 与行索引 4 不同,则行索引 3 的 holder.view 将为 VISIABLE行索引 4 的holder.icon 将是 VISIABLE。因此,您无法在一个条件 block 中更改它,因为您一次会获得一个 ViewHolder

将其转换为2个检查 block

最初将 INVISIABLE/GONE 设置为 RecycleView 将重用 View

        holder.view.setVisibility(View.GONE);
        holder.icon.setVisibility(View.INVISIBLE);

对于底部 View (holder.view):

    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);

      }
  }

对于图标 View (holder.icon):

    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);
    }
}

另外添加保留此位置,因为位置 0 将显示图标

if (position == 0) {
    holder.icon.setVisibility(View.VISIBLE);
}

如果我正确地理解了你的问题,我认为这会解决你的问题。

关于java - 如何对 recyclerView 进行分组,在组之间添加分隔线并为每个组添加一个图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48881933/

相关文章:

java - Android中有多路通话时如何识别通话断开

string - 如何定义自定义字母顺序以在 go 中比较和排序字符串?

JavaScript:在 while 循环中更改对象中的值

java - 这是按标题、位置排序然后使用比较器排序的正确方法吗?

java - 在java中从csv中读取带逗号的值

java - Java计算Excel某列重复行数

java - 如何使用ASM进行字节码转换后定义类(类文件版本0.0)

java - 如何用 org.apache.commons.codec.binary.Base64 替换 android.util.Base64?

java - 如何以编程方式绘制 ImageButtons 的 5x5 矩阵?

java - 我的应用程序使用相机不记录纬度和经度(文件元数据)