Как заставить 9 изображений исправлений масштабироваться только для представлений, которым требуется больше места в RecyclerView?

#android #android-layout #android-recyclerview #nine-patch

#Android #android-макет #android-recyclerview #девять исправлений

Вопрос:

У меня есть a RecyclerView , который я обновляю сообщением, я установил фон Textview внутри RecyclerView с помощью a 9-patch-image .

Теперь проблема в том, что: когда длина сообщения мала, 9 изображений исправлений работают хорошо и масштабируются только до размера пространства, занимаемого текстом, но когда одно сообщение состоит из текста со многими символами, очевидно, что 9 изображений исправлений масштабируются, но когда это происходитон также масштабирует все предыдущие элементы в RecyclerView .

Что может быть причиной этого и как это исправить?

Вот код для моего адаптера:

CustomAdapter.class

     public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.FeedsViewHolder>
{



    DataHolder d1 = new DataHolder();

    public  class FeedsViewHolder extends RecyclerView.ViewHolder
    {
        private TextView chat;
        private Typeface face;
        private Context mcontext;

        FeedsViewHolder(View itemView)
        {
            super(itemView);
            mcontext = itemView.getContext();
            chat = (TextView)itemView.findViewById(R.id.chatMessage);
            face = Typeface.createFromAsset(itemView.getContext().getAssets(), "Fonts/Roboto-Regular.ttf");
            chat.setTypeface(face);


        }



    }

    private static class DataHolder
    {
        List<Text> feeds;

    }



    CustomAdapter(List<Text> feeds)
    {
        this.d1.feeds = feeds;
    }



    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }


    @Override
    public FeedsViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.chat_message, viewGroup, false);
        FeedsViewHolder pvh = new FeedsViewHolder(v);
        return pvh;
    }



    @Override
    public void onBindViewHolder(FeedsViewHolder feedViewHolder, int i)
    {
        RelativeLayout.LayoutParams params =
                (RelativeLayout.LayoutParams)feedViewHolder.chat.getLayoutParams();
        feedViewHolder.chat.setPadding(0,0,0,0);
        if(d1.feeds.get(i).isMachineOrHuman())
        {
            params.addRule(RelativeLayout.ALIGN_PARENT_START);
            feedViewHolder.chat.setLayoutParams(params);
            feedViewHolder.chat.setBackground(ContextCompat.getDrawable(feedViewHolder.mcontext, R.drawable.user));
            feedViewHolder.chat.setText(d1.feeds.get(i).getMessage());
        }

        else
        {
            params.addRule(RelativeLayout.ALIGN_PARENT_END);
            feedViewHolder.chat.setLayoutParams(params);
            feedViewHolder.chat.setBackground(ContextCompat.getDrawable(feedViewHolder.mcontext, R.drawable.ais));
            feedViewHolder.chat.setText(d1.feeds.get(i).getMessage());
        }



    }

    @Override
    public int getItemCount()
    {

        if(d1.feeds!=null)
        {
            return d1.feeds.size();
        }
        else
        {
            return 0;
        }
    }



}
 

Здесь задается фон:

     feedViewHolder.chat.setBackground(ContextCompat.getDrawable(feedViewHolder.mcontext, R.drawable.user));
feedViewHolder.chat.setBackground(ContextCompat.getDrawable(feedViewHolder.mcontext, R.drawable.ais));
 

Это XML для адаптера TextView :

chat_message.xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@ id/chat_rel"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView android:id="@ id/chatMessage"
android:layout_width="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:gravity="start"
android:textSize="15sp"
android:textColor="#ffffff"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android" />
 

РЕДАКТИРОВАТЬ-1

Вот как это выглядит до и после:

IMAGE-1

введите описание изображения здесь

IMAGE-2

введите описание изображения здесь

Комментарии:

1. Вероятно, это из-за атрибута android:gravity="start" . вы должны изменить гравитацию во время выполнения для обоих чатов. Правильный должен иметь android:gravity="end"

2. Извините, я не понял, вы можете уточнить это подробнее?

3. Это устранило проблему, опубликуйте ее в качестве ответа, может помочь кому-то в будущем!

Ответ №1:

Очевидно, проблема заключалась в том, где я определил гравитацию:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@ id/chat_rel"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView android:id="@ id/chatMessage"
android:layout_width="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:gravity="start" <!-- here -->
android:textSize="15sp"
android:textColor="#ffffff"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android" />
 

Решение:

Удалено android:gravity="start" из XML и определено программно:

             feedViewHolder.chat.setGravity(Gravity.START);
            feedViewHolder.chat.setGravity(Gravity.END);
 

Становится onBindViewHolder() :

 @Override
public void onBindViewHolder(FeedsViewHolder feedViewHolder, int i)
{
    RelativeLayout.LayoutParams params =
            (RelativeLayout.LayoutParams)feedViewHolder.chat.getLayoutParams();

    if(d1.feeds.get(i).isMachineOrHuman())
    {
        params.addRule(RelativeLayout.ALIGN_PARENT_START);
        feedViewHolder.chat.setLayoutParams(params);
        feedViewHolder.chat.setGravity(Gravity.START);
        feedViewHolder.chat.setBackground(ContextCompat.getDrawable(feedViewHolder.mcontext, R.drawable.user));
        feedViewHolder.chat.setText(d1.feeds.get(i).getMessage());
    }

    else
    {
        params.addRule(RelativeLayout.ALIGN_PARENT_END);
        feedViewHolder.chat.setLayoutParams(params);
        feedViewHolder.chat.setGravity(Gravity.END);
        feedViewHolder.chat.setBackground(ContextCompat.getDrawable(feedViewHolder.mcontext, R.drawable.ais));
        feedViewHolder.chat.setText(d1.feeds.get(i).getMessage());
    }



}