Как создать собственный адаптер для RecyclerView? - PullRequest
1 голос
/ 11 марта 2020

Я следовал официальному Android учебнику и этому учебнику , но они действительно разные, и я не могу понять, как создать свой собственный адаптер.

У меня есть RecyclerView, где я хочу отобразить некоторые музыкальные файлы, поэтому в своем настраиваемом адаптере я сделал: быть в переопределенных методах. Я сделал это с обычным списком, и мой адаптер был таким:

          View view = convertView;
        if (view == null) {
            LayoutInflater layoutInflater = (LayoutInflater)
                    context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = layoutInflater.inflate(viewRes, parent, false);
        }
        final String song= songList.get(position);
        if (song != null) {
            final TextView title = (TextView) view.findViewById(R.id.title_song);
            final TextView group = (TextView) view.findViewById(R.id.group_song);
            final ImageView image= (ImageView) view.findViewById(R.id.image_song);
            title.setText(song);
            description.setText(song);
        }
        return view;
    }

Так как мне исправить мой адаптер? Я действительно потерян, и учебник не очень помогает

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Вы можете использовать держатель как-то так, где в привязке данных вы будете устанавливать данные для каждого элемента строки. Можете следовать приведенному ниже примеру

public class RestaurantListAdapter extends RecyclerView.Adapter<RestaurantListAdapter.RestaurantViewHolder> {
    private ArrayList<Restaurant> mRestaurants = new ArrayList<>();
    private Context mContext;

    public RestaurantListAdapter(Context context, ArrayList<Restaurant> restaurants) {
        mContext = context;
        mRestaurants = restaurants;
    }

    public class RestaurantViewHolder extends RecyclerView.ViewHolder {
        @Bind(R.id.restaurantImageView) ImageView mRestaurantImageView;
        @Bind(R.id.restaurantNameTextView) TextView mNameTextView;
        @Bind(R.id.categoryTextView) TextView mCategoryTextView;
        @Bind(R.id.ratingTextView) TextView mRatingTextView;

        private Context mContext;

        public RestaurantViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            mContext = itemView.getContext();
        }

        public void bindRestaurant(Restaurant restaurant) {
            mNameTextView.setText(restaurant.getName());
            mCategoryTextView.setText(restaurant.getCategories().get(0));
            mRatingTextView.setText("Rating: " + restaurant.getRating() + "/5");
        }
    }
}
1 голос
/ 11 марта 2020

Вот пользовательский адаптер. Я надеюсь, что это соответствует вашим потребностям, и я не делал ошибок, создавая это. Найдите некоторые учебники Room или Retrofit, которые используют RecyclerView. Если вы go через реализацию Recycler несколько раз, это станет намного понятнее.

public class CustomAdapter extends ListAdapter<CustomItem, CustomAdapter.CustomHolder> {
    private OnItemClickListener listener;

    @NonNull
    @Override
    public CustomHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.custom_item, parent, false);

        return new CustomHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull CustomHolder holder, int position) {
        CustomItem currentCustomItem = getItem(position);
        holder.textViewTitle.setText(currentCustomItem.getTitle());
        holder.textViewDescription.setText(currentCustomItem.getDescription());
    }

    public CustomItem getCustomItemAt(int position) {
        return getItem(position);
    }

    class CustomHolder extends RecyclerView.ViewHolder {
        private TextView textViewTitle;
        private TextView textViewDescription;

        public NoteHolder(@NonNull View itemView) {
            super(itemView);
            textViewTitle = itemView.findViewById(R.id.text_view_title);
            textViewDescription = itemView.findViewById(R.id.text_view_description);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    if (listener != null && position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(getItem(position));
                    }
                }
            });
        }
    }

    public interface OnItemClickListener {
        void onItemClick(Note note);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...