Как я могу добавить две пользовательские строки в одном Recyclerview без замены элементов? - PullRequest
1 голос
/ 31 октября 2019

Как я могу добавить две пользовательские строки в одном Recyclerview без замены элементов, он показывает две пользовательские строки, но он удаляет элемент номер 1, как я могу это решить?

Код

public class MessagesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private List<MessagesEntity> messagesEntityList;
    private AppDatabase appDatabase;
    private Typeface typeface;

    public MessagesAdapter(Context context, List<MessagesEntity> messagesEntityList) {
        this.context = context;
        this.messagesEntityList = messagesEntityList;
        appDatabase = Room.databaseBuilder(context, AppDatabase.class, "app_database").allowMainThreadQueries().build();
        typeface = Typeface.createFromAsset(context.getAssets(), "MainFont.ttf");
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == 100) {
            return new ViewHolder1(LayoutInflater.from(parent.getContext()).inflate(R.layout.row_short_description, parent, false));
        } else {
            return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row_message, parent, false));
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (getItemViewType(position) == 100) {
            ViewHolder1 viewHolder1 = (ViewHolder1) holder;
            viewHolder1.txtShortDescription.setTypeface(typeface);
            viewHolder1.txtShortDescription.setText(MessagesActivity.description);
        } else {
            ViewHolder viewHolder = (ViewHolder) holder;
            viewHolder.txtMessage.setTypeface(typeface);
            if (position % 2 == 0) {
                viewHolder.linearLayout1.setBackgroundColor(context.getResources().getColor(R.color.m_a_1_row_background_1));
                viewHolder.txtMessage.setTextColor(context.getResources().getColor(R.color.m_a_1_row_category_name_2));
            } else if (position % 2 == 1) {
                viewHolder.linearLayout1.setBackgroundColor(context.getResources().getColor(R.color.m_a_1_row_background_2));
                viewHolder.txtMessage.setTextColor(context.getResources().getColor(R.color.m_a_1_row_category_name_1));
            }
            if (appDatabase.favoriteDao().getMessage(messagesEntityList.get(position).getId()).size() == 0) {
                viewHolder.imgFavorite.setColorFilter(context.getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN);
            } else {
                viewHolder.imgFavorite.setColorFilter(context.getResources().getColor(R.color.cinnabar), PorterDuff.Mode.SRC_IN);
            }
            viewHolder.txtMessage.setText(messagesEntityList.get(position).getMessage());
        }
    }

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

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return 100;
        } else {
            return super.getItemViewType(position);
        }
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.linear_layout_1)
        LinearLayout linearLayout1;
        @BindView(R.id.txt_message)
        TextView txtMessage;
        @BindView(R.id.img_favorite)
        ImageView imgFavorite;
        @BindView(R.id.img_copy)
        ImageView imgCopy;
        @BindView(R.id.img_share)
        ImageView imgShare;

        ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

        @OnClick({R.id.img_share, R.id.img_copy, R.id.img_favorite})
        void onClick(View view) {
            switch (view.getId()) {
                case R.id.img_share:
                    Intent intent = new Intent(Intent.ACTION_SEND);
                    intent.putExtra(Intent.EXTRA_TEXT, messagesEntityList.get(getAdapterPosition()).getMessage());
                    intent.setType("text/plain");
                    context.startActivity(Intent.createChooser(intent, ""));
                    break;
                case R.id.img_copy:
                    ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
                    clipboard.setPrimaryClip(ClipData.newPlainText("copied", messagesEntityList.get(getAdapterPosition()).getMessage()));
                    CustomToast.show(context, context.getResources().getString(R.string.copied));
                    break;
                case R.id.img_favorite:
                    if (appDatabase.favoriteDao().getMessage(messagesEntityList.get(getAdapterPosition()).getId()).size() == 0) {
                        FavoriteEntity favoriteEntity = new FavoriteEntity();
                        favoriteEntity.setId(messagesEntityList.get(getAdapterPosition()).getId());
                        favoriteEntity.setMessage(messagesEntityList.get(getAdapterPosition()).getMessage());
                        favoriteEntity.setCategoryName(messagesEntityList.get(getAdapterPosition()).getCategoryName());
                        appDatabase.favoriteDao().addMessage(favoriteEntity);
                        CustomToast.show(context, context.getResources().getString(R.string.added_to_favorite));
                        imgFavorite.setColorFilter(context.getResources().getColor(R.color.cinnabar), PorterDuff.Mode.SRC_IN);
                    } else {
                        appDatabase.favoriteDao().deleteMessage(messagesEntityList.get(getAdapterPosition()).getId());
                        CustomToast.show(context, context.getResources().getString(R.string.removed_from_favorite));
                        imgFavorite.setColorFilter(context.getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN);
                    }
                    break;
            }
        }

    }

    class ViewHolder1 extends RecyclerView.ViewHolder {

        @BindView(R.id.linear_layout_1)
        LinearLayout linearLayout1;
        @BindView(R.id.txt_short_description)
        TextView txtShortDescription;

        ViewHolder1(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

    }

}

Я хочу сначала показать строку row_short_description и показать все элементы после этого без удаления каких-либо данных ............................ .................................................. .................................................. ....

1 Ответ

1 голос
/ 01 ноября 2019

easy - исправление индексов. Теперь у вас есть messagesEntityList.size () + 1 элемент, поэтому:

@Override
public int getItemCount() {
    return messagesEntityList.size() + 1;
}

Однако вы также должны исправить индексы в onBindViewHolder, но это подвержено ошибкам . Адаптер не должен знать обо всем этом, вы должны только предоставить ему данные , которые он затем привязывает к держателям вида.

Лучшее решение - создатьдва класса, которые выходят из одного интерфейса:

// Base message for the adapter
interface BaseMessage {}


// Message for the adapter
class Message implements BaseMessage {

    private int id;
    private String message;
    private String categoryName;

    Message(int id, String message, String categoryName) {
        this.id = id;
        this.message = message;
        this.categoryName = categoryName;
    }

    public int getId() {
        return id;
    }

    public String getMessage() {
        return message;
    }

    public String getCategoryName() {
        return categoryName;
    }
}


// Message description for the adapter
class MessageDescription implements BaseMessage { }

А затем ваш адаптер (вам нужно преобразовать BaseMessage из списка в Message, когда вам это нужно):

// BaseMessage: Message, MessageDescription
// Message -- MessageViewHolder
// MessageDescription -- DescriptionViewHolder
public class MessagesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int VIEW_TYPE_MESSAGE = 0;
    private static final int VIEW_TYPE_SHORT_DESCRIPTION = 1;

    private Context context;
    private List<BaseMessage> messages;
    private AppDatabase appDatabase;
    private Typeface typeface;

    public MessagesAdapter(Context context, List<BaseMessage> messages) {
        this.context = context;
        this.messages = messages;
        appDatabase = Room.databaseBuilder(context, AppDatabase.class, "app_database").allowMainThreadQueries().build();
        typeface = Typeface.createFromAsset(context.getAssets(), "MainFont.ttf");
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        if (viewType == VIEW_TYPE_SHORT_DESCRIPTION) {
            return new DescriptionViewHolder(inflater.inflate(R.layout.row_short_description, parent, false));
        } else {
            return new MessageViewHolder(inflater.inflate(R.layout.row_message, parent, false));
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        int viewType = getItemViewType(position);
        if (viewType == VIEW_TYPE_SHORT_DESCRIPTION) {
            DescriptionViewHolder viewHolder1 = (DescriptionViewHolder) holder;
            viewHolder1.txtShortDescription.setTypeface(typeface);
            viewHolder1.txtShortDescription.setText(MessagesActivity.description);
        } else {
            MessageViewHolder viewHolder = (MessageViewHolder) holder;
            Message message = (Message) messages.get(position);
            viewHolder.txtMessage.setTypeface(typeface);
            if (position % 2 == 0) {
                viewHolder.linearLayout1.setBackgroundColor(context.getResources().getColor(R.color.m_a_1_row_background_1));
                viewHolder.txtMessage.setTextColor(context.getResources().getColor(R.color.m_a_1_row_category_name_2));
            } else {
                viewHolder.linearLayout1.setBackgroundColor(context.getResources().getColor(R.color.m_a_1_row_background_2));
                viewHolder.txtMessage.setTextColor(context.getResources().getColor(R.color.m_a_1_row_category_name_1));
            }
            if (appDatabase.favoriteDao().getMessage(message.getId()).size() == 0) {
                viewHolder.imgFavorite.setColorFilter(context.getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN);
            } else {
                viewHolder.imgFavorite.setColorFilter(context.getResources().getColor(R.color.cinnabar), PorterDuff.Mode.SRC_IN);
            }
            viewHolder.txtMessage.setText(message.getMessage());
        }
    }

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

    @Override
    public int getItemViewType(int position) {
        BaseMessage base = messages.get(position);
        if (base instanceof MessageDescription) {
            return VIEW_TYPE_SHORT_DESCRIPTION;
        } else {
            return VIEW_TYPE_MESSAGE;
        }
    }

    class MessageViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.linear_layout_1)
        LinearLayout linearLayout1;
        @BindView(R.id.txt_message)
        TextView txtMessage;
        @BindView(R.id.img_favorite)
        ImageView imgFavorite;
        @BindView(R.id.img_copy)
        ImageView imgCopy;
        @BindView(R.id.img_share)
        ImageView imgShare;

        MessageViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

        @OnClick({R.id.img_share, R.id.img_copy, R.id.img_favorite})
        void onClick(View view) {
            Message message = (Message) messages.get(getAdapterPosition());
            switch (view.getId()) {
                case R.id.img_share:
                    Intent intent = new Intent(Intent.ACTION_SEND);
                    intent.putExtra(Intent.EXTRA_TEXT, message.getMessage());
                    intent.setType("text/plain");
                    context.startActivity(Intent.createChooser(intent, ""));
                    break;
                case R.id.img_copy:
                    ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
                    clipboard.setPrimaryClip(ClipData.newPlainText("copied", message.getMessage()));
                    CustomToast.show(context, context.getResources().getString(R.string.copied));
                    break;
                case R.id.img_favorite:
                    if (appDatabase.favoriteDao().getMessage(message.getId()).size() == 0) {
                        FavoriteEntity favoriteEntity = new FavoriteEntity();
                        favoriteEntity.setId(message.getId());
                        favoriteEntity.setMessage(message.getMessage());
                        favoriteEntity.setCategoryName(message.getCategoryName());
                        appDatabase.favoriteDao().addMessage(favoriteEntity);
                        CustomToast.show(context, context.getResources().getString(R.string.added_to_favorite));
                        imgFavorite.setColorFilter(context.getResources().getColor(R.color.cinnabar), PorterDuff.Mode.SRC_IN);
                    } else {
                        appDatabase.favoriteDao().deleteMessage(message.getId());
                        CustomToast.show(context, context.getResources().getString(R.string.removed_from_favorite));
                        imgFavorite.setColorFilter(context.getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN);
                    }
                    break;
            }
        }

    }

    class DescriptionViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.linear_layout_1)
        LinearLayout linearLayout1;
        @BindView(R.id.txt_short_description)
        TextView txtShortDescription;

        DescriptionViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

    }

}

Итогда от тебя активность:

// Create a description object
MessageDescription description = MessageDescription();
List<Message> messages = ... // get your messages from the DB, convert them to Message class
// Combine the description and messages into one list
List<BaseMessage> combinedMessages = new ArrayList<>();
// Put description on the first place
combinedMessages.add(description);
combinedMessages.addAll(messages);
MessagesAdapter adapter = new MessagesAdapter(this, combinedMessages);
recyclerView.adapter = adapter;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...