Как я могу отслеживать видимость моего текстового представления на каждой странице в viewpager2? - PullRequest
1 голос
/ 01 апреля 2020

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

У меня есть приведенный ниже код, и я застрял на том, как позволить пользователю:

  • Когда он попадет в слайд-шоу, он получит изображения с заголовком и текстом " описание "для каждого.
  • при нажатии" ENTER "установить текст на этом изображении невидимым.
  • Когда пользователь перемещается вправо, следующий вид (ы) будет содержать текст и изображение. - Когда пользователь перемещается назад влево, текстовое представление, которое он установил как невидимое, должно оставаться невидимым, и у него есть возможность сделать его снова видимым, просто нажав клавишу ввода.

Последняя часть - это то, на чем я застрял, так как я не могу понять, как каждая «Линейная компоновка» внутри моего видоискателя будет помнить свою видимость и действовать соответственно. (т.е. становится видимым, как только он стал невидимым, и наоборот).

Я ценю ваш вклад.

Пожалуйста, найдите код ниже:

My ViewPager XML file:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/fragment_pager_main_parent"
    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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/default_background"
    tools:context=".PowerPointActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/fragment_pager_viewPager2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

Мои просмотры XML file:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
    android:id="@+id/fragment_pager_item_parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/fragment_pager_item_imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:scaleType="fitXY"/>

    <LinearLayout
        android:id="@+id/fragment_pager_item_main_child"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAlignment="textStart"
        android:orientation="vertical"
        app:layout_constraintTop_toTopOf="@+id/fragment_pager_item_parent"
        app:layout_constraintStart_toStartOf="@+id/fragment_pager_item_parent">

        <!--            the linear layout below was not initially here but I was trying to have a layout for each child.-->
        <LinearLayout
        android:id="@+id/fragment_pager_item_child"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAlignment="textStart"
        android:orientation="vertical"
        app:layout_constraintTop_toTopOf="@+id/fragment_pager_item_parent"
        app:layout_constraintStart_toStartOf="@+id/fragment_pager_item_parent">

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/fragment_pager_item_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:layout_marginStart="10dp"
            android:layout_marginTop="5dp"
            android:gravity="top"
            android:textColor="#FFFFFF"
            android:textSize="12dp"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="@+id/fragment_pager_item_child"
            app:layout_constraintTop_toTopOf="@+id/fragment_pager_item_child"
            app:layout_constraintVertical_bias="0.0"
            tools:text="Topic" />

        <TextView
            android:id="@+id/fragment_pager_item_about"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="top"
            android:layout_marginStart="10dp"
            android:elegantTextHeight="true"
            android:text="@string/about_topic"
            android:textColor="#ffffff"
            android:textSize="12sp"
            app:layout_constraintHorizontal_bias="10"
            app:layout_constraintStart_toStartOf="@+id/fragment_pager_item_title"
            app:layout_constraintTop_toBottomOf="@id/fragment_pager_item_title"
            app:layout_dodgeInsetEdges="left" />
            </LinearLayout>
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

Класс моего адаптера:

public class PowerpointAdapter extends RecyclerView.Adapter{

    private List<Image> mPowerPointList;

    static class PagesViewHolder extends RecyclerView.ViewHolder {
        private ImageView mViewImageView;
        private TextView mTitleView;
        private TextView mDescriptionView;
        private LinearLayout mLinearLayout;

        public PagesViewHolder(@NonNull View itemView) {
            super(itemView);
            Timber.i("PagesViewHolder");
            mViewImageView = itemView.findViewById(R.id.fragment_pager_item_imageView);
            mTitleView = itemView.findViewById((R.id.fragment_pager_item_title));
            mDescriptionView = itemView.findViewById(R.id.fragment_pager_item_about);
            mLinearLayout = itemView.findViewById(R.id.fragment_pager_item_child);
        }
    }

    public PowerpointAdapter(List<Image> mPowerPointList) { this.mPowerPointList = mPowerPointList;}

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Timber.i("onCreateViewHolder");
        View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_pager_item, parent, false);
        return new PagesViewHolder(mView);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        Timber.i("onBindViewHolder");
        PagesViewHolder mViewHolder = (PagesViewHolder) holder;
        Image powerpoint = mPowerPointList.get(position);
        mViewHolder.mViewImageView.setImageResource(powerpoint.getTrialImage());
        mViewHolder.mTitleView.setText(powerpoint.getTitle());
        mViewHolder.mDescriptionView.setText(powerpoint.getDescription());
        mViewHolder.mLinearLayout.setVisibility(View.VISIBLE);
    }

    @Override
    public int getItemCount()  {
        Timber.i("getItemCount");
        return mPowerPointList.size();}

Класс моей активности:

// for a one image display, the image can be treated similarly to a powerpoint.

public class PowerPointActivity extends Activity {
    private ViewPager2 viewPager2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Timber.i("onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_pager_main);
        ConstraintLayout mLayout = findViewById(R.id.fragment_pager_main_parent);
        mLayout.setBackgroundResource(R.color.Transparent_black);
        viewPager2 = findViewById(R.id.fragment_pager_viewPager2);
        setUpPagerAdapter();
    }
    /**
     * this method will set up the adapter
     */
    private void setUpPagerAdapter() {
        Timber.i("SetUpPagerAdapter");
        PowerpointAdapter pagerAdapter = new PowerpointAdapter(fetchDummyData());
        viewPager2.setAdapter(pagerAdapter);
        viewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
    }
    /**
     * @return this method will return dummy data in form of list
     */
    private List<Image> fetchDummyData() {
        Timber.i("fetchDummyData in Power Point Activity");
        List<Image> powerpointList = new ArrayList<>();
        String[] dummyArrDescriptions = getResources().getStringArray(R.array.array_str_descriptions_for_powerPoints);
        String[] dummyArrTitles = getResources().getStringArray(R.array.array_str_titles_for_powerPoints);
        for (int index = 0; index < dummyArrTitles.length; ++index) {
            Image image = new Image(dummyArrTitles[index], dummyArrDescriptions[index], R.drawable.ppt_image);
            powerpointList.add(image);
        }
        return powerpointList;
    }
    /**
     * this method handles slideshow navigation
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Timber.i("OnKeyDown");
        switch (keyCode) {
            case KeyEvent.KEYCODE_DPAD_LEFT: {
                viewPager2.setCurrentItem(viewPager2.getCurrentItem() - 1);
                Toast.makeText(PowerPointActivity.this, "Left pressed!", Toast.LENGTH_SHORT).show();
                break;
            }
            case KeyEvent.KEYCODE_DPAD_RIGHT: {
                viewPager2.setCurrentItem(viewPager2.getCurrentItem() + 1);
                Toast.makeText(PowerPointActivity.this, "Right pressed!", Toast.LENGTH_SHORT).show();
                break;
            }
            case KeyEvent.KEYCODE_BACK: {
                Toast.makeText(PowerPointActivity.this, "Back pressed!", Toast.LENGTH_SHORT).show();
                super.onBackPressed();
                break;
            }

            // todo: Fix the visibility of each page description

            case KeyEvent.KEYCODE_ENTER: {
                if (findViewById(R.id.fragment_pager_item_child).isShown()) {
                    Timber.i("It is shown. Setting it to not shown! "+ viewPager2.getCurrentItem() + " now.");

               // here this specific child's text should be set to invisible and remembered.     findViewById(R.id.fragment_pager_item_child).setVisibility(View.INVISIBLE);
                    LinearLayout mLayout = findViewById(R.id.fragment_pager_item_child);
                    Animation outFade = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.fade_out);
                    mLayout.startAnimation(outFade);
                    mLayout.startAnimation(outFade);
                    break;
                } else {
                    Timber.i("It is now not shown. Setting it to shown! " + viewPager2.getCurrentItem() + " now.");
                    LinearLayout mLayout = findViewById(R.id.fragment_pager_item_child);
                    Animation aniFade = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.fade_in);
                    mLayout.startAnimation(aniFade);
                    mLayout.startAnimation(aniFade);
                    findViewById(R.id.fragment_pager_item_child).setVisibility(View.VISIBLE);
                    break;
                }
            }
        }
        return false;
    }
}

Спасибо!

1 Ответ

0 голосов
/ 01 апреля 2020

Из документации Android мы можем обнаружить, что Adapter выполняет следующие обязанности:

  • Действует как мост между AdapterView и нижележащим данные для этого представления.
  • Предоставляет доступ к элементам данных
  • Ответственный за создание представления для каждого элемента в наборе данных.

Так что в основном работа View не заключается в том, чтобы помнить видимость ребенка и действовать в соответствии с ним. Это PowerpointAdapter ответственность.

Вам необходимо поле состояния в вашем Image объекте, и оно должно изменяться при изменении видимости представления. Кроме того, не забудьте установить видимость представления в соответствии с этой переменной состояния.

Например:

 @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        Timber.i("onBindViewHolder");
        PagesViewHolder mViewHolder = (PagesViewHolder) holder;
        Image powerpoint = mPowerPointList.get(position);
        mViewHolder.mViewImageView.setImageResource(powerpoint.getTrialImage());
        mViewHolder.mTitleView.setText(powerpoint.getTitle());
        mViewHolder.mDescriptionView.setText(powerpoint.getDescription());
        if(powerpoint.isLayoutVisibile){ 
          mViewHolder.mLinearLayout.setVisibility(View.VISIBLE);
        }else{
          mViewHolder.mLinearLayout.setVisibility(View.GONE);
        }
    }

И внутри вашего ClickListener вы должны изменить это поле и уведомить PowerpointAdapter из этих изменений.

...