Как сделать ImageViews разными с помощью Timusus RecyclerView-FastScroll - PullRequest
0 голосов
/ 05 октября 2019

В настоящее время я использую библиотеку тимуса https://github.com/timusus/RecyclerView-FastScroll для реализации быстрой прокрутки в моей программе. Есть ли способ иметь разные изображения для каждого предмета? Я не смог найти пример проекта, касающегося манипулирования изображениями. Ближайший образец от автора - дублирование изображений вместо их замены.

Мой фрагмент активности:

public class CollectionFragment extends Fragment {

private CollectionViewModel collectionViewModel;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    collectionViewModel =
            ViewModelProviders.of(this).get(CollectionViewModel.class);
    View root = inflater.inflate(R.layout.fragment_collection, container, false);
    FastScrollRecyclerView recyclerView = root.findViewById(R.id.recycler);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.setAdapter(new MultiViewTypeAdapter());
    DividerItemDecoration itemDecoration = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);
    itemDecoration.setDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.list_divider, null));
    recyclerView.addItemDecoration(itemDecoration);
    return root;
}
}

Мой адаптер выглядит следующим образом:

public class MultiViewTypeAdapter extends RecyclerView.Adapter<MultiViewTypeAdapter.ViewHolder>
    implements FastScrollRecyclerView.SectionedAdapter,
    FastScrollRecyclerView.MeasurableAdapter {

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false));
}

@Override
public int getItemViewType(int position) {
    if (position % 2 == 0) {
        return R.layout.list_item_header;
    }
    return R.layout.list_item;
}

@SuppressLint("DefaultLocale")
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.text.setText(getNameForItem(position));
    holder.imgview.setImageResource(getImageForItem(position));
}

@Override
public int getItemCount() {
    return 8;
}

@SuppressLint("DefaultLocale")
@NonNull
@Override
public String getSectionName(int position) {
    if (position % 2 == 0) {
        return String.format("S%d", (position / 2) + 1);
    } else {
        return String.format("%d", position - position / 2);
    }
}

@Override
public int getViewTypeHeight(RecyclerView recyclerView,
                             @Nullable RecyclerView.ViewHolder viewHolder, int viewType) {
    if (viewType == R.layout.list_item_header) {
        return recyclerView.getResources().getDimensionPixelSize(R.dimen.list_item_header_height);
    } else if (viewType == R.layout.list_item) {
        return recyclerView.getResources().getDimensionPixelSize(R.dimen.list_item_height);
    }
    return 0;
}

@SuppressLint("DefaultLocale")
@NonNull
private String getNameForItem(int position) {
    if (position % 2 == 0) {
        return String.format("Section %d", (position / 2) + 1);
    } else {
        return String.format("Item %d", position - position / 2);
    }
}

@SuppressLint("DefaultLocale")
@NonNull
private int getImageForItem(int position) {
    if (position % 2 == 0) {
        return R.drawable.collection_img_1;
    } else {
        return R.drawable.collection_img_2;
    }
}

static class ViewHolder extends RecyclerView.ViewHolder {
    public TextView text;
    public ImageView imgview;

    ViewHolder(View itemView) {
        super(itemView);
        text = itemView.findViewById(R.id.text);
        imgview = itemView.findViewById(R.id.collectionImage);
    }
}
}

Затем я столкнулся с этой ошибкой: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference. Как мне это исправить?

...