Как мне не перерабатывать только первые 2 просмотра моего маклера или каких-либо предметов? - PullRequest
0 голосов
/ 15 мая 2018

Я использую реселлер-просмотр для отображения и трансляции видео пользователей. Однако, когда я прокручиваю представление рециркулятора, я вижу свой первый вид, в котором мое видео перерабатывается, поэтому его не видят другие пользователи. Есть ли способ убедиться, что первое представление не было переработано, поэтому мне не нужно беспокоиться о том, что мой просмотр видео будет перезагружаться каждый раз, когда я прокручиваю свой список?

Вот мой код: В моем фрагменте ... ...

 <android.support.v7.widget.RecyclerView
        android:id="@+id/videoList"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:visibility="invisible"
        app:layout_constraintBottom_toTopOf="@+id/myButtonContainer"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/myoldContainer">

...

и соответствующий адаптер ...

public class GroupAdapter extends RecyclerView.Adapter<GroupAdapter.myViewHolder> {

    private CopyOnWriteArrayList<Person> persons;
    private Context mContext;

    public GroupAdapter(@NonNull final CopyOnWriteArrayList<Person> persons , Context context) {
        this.persons = persons;
        this.mContext= context;

        for (Person person : this.persons) {
           //get names
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_person, parent, false);
        final MyViewHolder viewHolder = new MyViewHolder(layout);
        return viewHolder;
    }
     @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {



        final Person person = person.get(position);
                final Participant participant = person.getParticipant();


                if (person.getName() != null) {
                    holder.personName.setText(person.getName());
                }

                if (person.getImage() != null) {
                    holder.personImage.setImageBitmap(person.getImage());
                } else {
                    holder.personImage.setImageResource(R.drawable.default_profile);
                }
                holder.personImage.setVisibility(View.INVISIBLE);
                holder.personImage.setVisibility(View.VISIBLE);

                final VideoView videoView;
                if (participant.isMe) {
                    videoView = participant.videoStreamer.videoView;
                } else {
                    videoView = participant.videoPlayer.videoView;
                }
                if (holder.personVideo.getChildCount() != 0) {
                        holder.personVideo.removeAllViews();

                }
                if (videoView.getParent() != null) {
                    ViewGroup parent = (ViewGroup) videoView.getParent();
                        parent.removeView(videoView);

                }
                holder.personVideo.addView(videoView, myViewHolder.videoLayoutParams);

                if (person.isVideoPaused()) {
                    holder.personVideo.setVisibility(View.INVISIBLE);
                    holder.personImage.setVisibility(View.VISIBLE);
                } else {

                    holder.personVideo.setVisibility(View.VISIBLE);
                    holder.personImage.setVisibility(View.INVISIBLE);
                }


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

    public static final class MyViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.personVideo)
        public ViewGroup personVideo;
        @BindView(R.id.personImage)
        public ImageView personImage;
        @BindView(R.id.personName)
        public TextView personName;

        protected static FrameLayout.LayoutParams videoLayoutParams = new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
        );

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

    }
}

Вот как я устанавливаю это в моем фрагменте:

  LinearLayoutManager manager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
            videoAdapter = new VideoAdapter(myHelper.getPeople(), getContext());
            videoList.setLayoutManager(manager);
            videoList.setAdapter(videoAdapter);

item_person:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_marginTop="0dp"
    android:background="@drawable/person_border"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <RelativeLayout
        android:id="@+id/personContainer"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent">

        <FrameLayout
            android:id="@+id/personVideo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/black" />

        <ImageView
            android:id="@+id/personImage"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/black"
            android:src="@drawable/default_profile" />

        <TextView
            android:id="@+id/personName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#AA555555"
            android:gravity="center_horizontal|bottom"
            android:textColor="@color/green"
            android:textSize="12sp"
            android:lines="1"
            android:ellipsize="end"
            tools:text="androiduser@gmail.com"
            android:layout_alignParentBottom="true" />

    </RelativeLayout>




</android.support.constraint.ConstraintLayout>

фрагмент с повторным отображением: xml

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
<RelativeLayout>
....
</RelativeLayout>
<include containers>...</include>
...
 <android.support.v7.widget.RecyclerView
        android:id="@+id/personList"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:visibility="invisible"
       >

    </android.support.v7.widget.RecyclerView>
 </android.support.constraint.ConstraintLayout>

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Ответ - да, вы действительно можете это сделать.Так как вы сказали «Первый предмет», вы просто добавляете чек.

if(position == 0)
{
holder.setIsRecyclable(false); //This line prevents the row from recycling
}
0 голосов
/ 15 мая 2018

Я не думаю, что "не переработка" видеоизображения фактически остановит его уничтожение при прокрутке.Дело не в утилизации отходов, а в том, что представление необязательное.

Я думаю, что такой сложный компонент, как VideoView, вообще не должен быть внутри RecyclerView. Вы можете попробовать добавить его как статический контент сверху, что, скорее всего, решит проблему.Вы можете использовать NestedScrollView для этого.Взгляните сюда: Recyclerview внутри scrollview - Как прокрутить весь контент?

Если вы все еще думаете, что хотите сохранить его в RecyclerView и отключить переработку, сделайте следующее.

Создайте отдельный тип просмотра для ваших элементов просмотра видео.Вот пример: https://stackoverflow.com/a/26573338/3086818. Рассматривайте ваш элемент просмотра видео как пример заголовка из примера.

Как только вы это сделаете, есть класс RecycledViewPool, который управляет переработкой предметов внутриRecyclerView.Вы можете сказать, какие виды переработать, а какие нет.По умолчанию это повторяет все представления.Чтобы отключить повторное использование элементов просмотра видео, используйте новый тип просмотра, например:

recyclerView.getRecycledViewPool().setMaxRecycledViews(TYPE_VIDEO_VIEW, 0);

, где TYPE_VIDEO_VIEW - новый тип, созданный вами в предыдущем примере.Число 0 указывает RecyclerView, сколько предметов для переработки - в данном случае это 0, что означает «не перерабатывать».Подробнее об этом здесь: https://stackoverflow.com/a/36313437/3086818.

Надеюсь, это поможет .. Удачи!

...