Одним из способов решения этой проблемы было бы использование двух viewHolders.
Во-первых, спроектируйте два отдельных макета XML: один для isNear, а другой для другого.
Например:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
Этот макет является первым макетом. А следующий - второй.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorAccent"
android:text="TextView" />
</LinearLayout>
Если вы посмотрите внимательно, вы увидите, что я изменил цвет текста для второго, чтобы показать изменение.
Теперь вам нужно взять два ViewHolders для каждого из них. Например:
Для первого:
public class FirstViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public FirstViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
Я связал textView XML здесь. Теперь второй viewHolder:
public class SecondViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public SecondViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
Здесь я связываю этот файл со вторым файлом XML.
Теперь в классе адаптера вам нужно расширить его следующим образом:
public class NewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Здесь вы увидите, что я не включил какой-либо конкретный viewHolder, но общий класс RecyclerView.ViewHolder
. Теперь вам нужно переопределить метод getItemViewType
в классе адаптера. Например:
@Override
public int getItemViewType(int position) {
if (isNear)
return 0;
else
return 1;
}
Теперь, один ваш метод onCreateViewHolder
в адаптере, вы должны проверить viewType и вернуть ViewHolder (View) в соответствии с ним. Например:
if (viewType == 0) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.first_layout,
viewGroup, false);
return new FirstViewHolder(view);
} else {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.second_layout,
viewGroup, false);
return new SecondViewHolder(view);
}
Теперь, в вашем методе onBindViewHolder
, получите элемент из вашего ArrayList и установите для него элементы ViewHolder.
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
if (isNear) {
FirstViewHolder holder = (FirstViewHolder) viewHolder;
holder.textView.setText("something you want to set");
} else {
SecondViewHolder holder = (SecondViewHolder) viewHolder;
holder.textView.setText("something you want to set");
}
}
Попробуйте и дайте мне знать, решаете ли вы это или нет.