как показать и скрыть просмотр изображений внутри recyclerView - PullRequest
0 голосов
/ 01 апреля 2019

Я использую для цикла, и у меня есть около 20 элементов, отображаемых в виде переработчика! Теперь, как мне скрыть / показать вид изображения как для циклов ... Здесь tts работает нормально, но когда я пытаюсь показать / скрыть с помощью этого, это не происходит ..

В настоящее время с приведенным ниже кодом, когда цикл завершается, это влияет на просмотр всего изображения, я хочу, чтобы это была строка (показать текущий (image1) и скрыть предыдущий просмотр изображений (изображение))

Я вызываю этот метод из основного класса Activity, но отображение или скрытие изображения не происходит

активность

 ......
 ...... 
private void ConvertTextToSpeech() {
    // TODO Auto-generated method stub
   //items.forEach( Multiples obj ->  System.out.println());
    int z=0;
    View holder=null; ImageView imageView=null;ImageView imageView1=null;
    for (Multiples p : items) {

        if(z>0){

            holder = recyclerView.findViewHolderForAdapterPosition(z).itemView;
            holder.findViewById(R.id.image).setVisibility(View.VISIBLE);
            holder.findViewById(R.id.image1).setVisibility(View.INVISIBLE);
        }
        if(z < items.size()) {
              holder = recyclerView.findViewHolderForAdapterPosition(z).itemView;
              holder.findViewById(R.id.image).setVisibility(View.INVISIBLE);
            holder.findViewById(R.id.image1).setVisibility(View.VISIBLE);

        }
        text = p.first + "  " + p.getSecond() + " Za "+p.getResult()+".";
        tts.speak(text, TextToSpeech.QUEUE_ADD, null);
    z++;
    }

}

XML

  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


    <com.balysv.materialripple.MaterialRippleLayout
        android:id="@+id/lyt_parent"
        style="@style/RippleStyleBlack"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:focusable="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <View
                android:layout_width="match_parent"
                android:layout_height="1px"
                android:background="@color/grey_10" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:textAlignment="gravity" >

                <View
                    android:layout_width="@dimen/spacing_large"
                    android:layout_height="wrap_content" />

                <ImageView
                    android:id="@+id/image"
                    android:layout_width="35dp"
                    android:layout_height="35dp"
                    android:background="@android:color/transparent"
                    android:src="@drawable/ic_arrow_right" />

                <ImageView
                    android:id="@+id/image1"
                    android:layout_width="51dp"
                    android:layout_height="35dp"
                    android:background="@android:color/transparent"
                    android:src="@drawable/ic_arrow_right"
                    android:visibility="invisible" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:paddingBottom="@dimen/spacing_middle"
                    android:paddingTop="@dimen/spacing_middle">

                    <TextView
                        android:id="@+id/name"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginEnd="@dimen/spacing_middle"
                        android:layout_marginRight="@dimen/spacing_middle"
                        android:fontFamily="sans-serif-condensed"
                        android:gravity="center|left"
                        android:text="36"
                        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
                        android:textColor="@color/grey_80"
                        android:textSize="30sp"

                        />



                </LinearLayout>





                <View
                    android:layout_width="@dimen/spacing_large"
                    android:layout_height="match_parent" />


            </LinearLayout>

            <View
                android:layout_width="match_parent"
                android:layout_height="1px"
                android:background="@color/grey_10" />

        </LinearLayout>

    </com.balysv.materialripple.MaterialRippleLayout>

</RelativeLayout>

адаптер

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

    private List<Multiples> items = new ArrayList<>();

    private Context ctx;
    private OnItemClickListener mOnItemClickListener;
    private int animation_type = 0;
    .........
    ......... 

Ответы [ 4 ]

0 голосов
/ 11 апреля 2019

Не следует напрямую изменять состояние просмотра элемента внутри адаптера следующим образом:

holder = recyclerView.findViewHolderForAdapterPosition(z).itemView;
holder.findViewById(R.id.image).setVisibility(View.VISIBLE);
holder.findViewById(R.id.image1).setVisibility(View.INVISIBLE);

Вместо этого вам нужно использовать определенный метод, чтобы сообщить адаптеру RecyclerView, что вам нужно изменить состояниепросмотр товара.

Следует отметить, что RecylerView естественным образом (программным способом) будет повторно обрабатывать свой предыдущий элемент всякий раз, когда ему нужно нарисовать другой элемент.Таким образом, вам нужно сохранять состояние каждого элемента, будь то использование определенной переменной внутри вашей модели или использование переменной для хранения каждого состояния элемента.

Если вы не хотите менять модель, вы можете использовать SparseBooleanArray для хранения состояния.Вы можете сделать что-то подобное в своем адаптере:

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

    private List<Multiples> mItems;

    // We use this to hold the image state.
    private SparseBooleanArray mImageStates;

    public YourAdapter(List<Multiples> items) {
      this.mItems = items;
      mImageStates = new SparseBooleanArray();

      ...
    }

    @Override
    public YourAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       ...
       return viewHolder;
    }


    @Override
    public void onBindViewHolder(ContactsAdapter.ViewHolder viewHolder, int position) {

      int itemPosition = viewHolder.getAdapterPosition();
      Multiples item = mItems.get(itemPosition);

      // Load the state by the previous saved state
      // default value is false.
      if(mImageStates.get(itemPosition)) {
        // show the images or something.
      } else {
        // hide the images or something.
      }

    }

    public void setState(int position, boolean isVisible) {
      mImageStates.put(position, isVisible);

    }

}

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

yourAdapter.setState(yourItemPosition, true);

, а затем уведомить адаптер об изменении с помощью:

yourAdapter.notifyItemChanged(yourItemPosition);

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

yourAdapter.notifyDataSetChanged();
0 голосов
/ 06 апреля 2019

Наконец-то есть решение

Я добавил два параметра в ваши коэффициенты. В вашем цикле, когда условие истинно, я устанавливаю переменную в соответствии с тем, что вы сделали с представлением изображения. после того, как я уведомляю RecyclerView. Итак, обратный вызов придет onBindViewHolder. там я добавил условия для показа / скрытия просмотра изображений.

предположим, что стрелка влево image и стрелка вправо image1

ПРИМЕЧАНИЕ. Android по умолчанию TextToSpeech не предоставляет прослушивателя событий для завершения. Итак, я попробовал новую библиотеку, которая в хорошем состоянии и обеспечивает распознавание речи и преобразование текста в речь функциональность.

Gradle:

implementation 'net.gotev:speech:1.4.0'

Инициализация:

Чтобы начать использовать библиотеку, вы должны инициализировать ее в своей деятельности.

public class YourActivity extends Activity {

private count = 0;
private maxCount = 0;

    Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        Speech.init(this, getPackageName());
        maxCount = items.size();

    }

    @Override
    protected void onDestroy() {
        // prevent memory leaks when activity is destroyed
        Speech.getInstance().shutdown();
    }
}

public class Multiples implements Serializable {

        private Boolean isShowimage = false;
        private Boolean isShowimage1 = false;

        public Boolean getShowimage() {
            return isShowimage;
        }

        public void setShowimage(Boolean showimage) {
            isShowimage = showimage;
        }

        public Boolean getShowimage1() {
            return isShowimage1;
        }

        public void setShowimage1(Boolean showimage1) {
            isShowimage1 = showimage1;
        }
    }

private void ConvertTextToSpeech() {

    if (count < maxCount) {

        reset();
        String text = items.get(count).first + "  " + items.get(count).getSecond() + " Za " + items.get(count).getResult() + ".";

        Speech.getInstance().say(text, new TextToSpeechCallback() {
            @Override
            public void onStart() {
                Log.i("speech", "speech started");
                items.get(count).setShowimage(false);
                items.get(count).setShowimage1(true);

                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCompleted() {
                Log.i("speech", "speech completed");
                ConvertTextToSpeech();
                count++;
            }

            @Override
            public void onError() {
                Log.i("speech", "speech error");
            }
        });
    }
}

private void reset() {
    for (Multiples p : items) {
        p.setShowimage(true);
        p.setShowimage1(false);
    }
}
@Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        final Multiples item = items.get(position);

        if (item.getShowimage()) {
            holder.image.setVisibility(View.VISIBLE);
        } else {
            holder.image.setVisibility(View.INVISIBLE);
        }

        if (item.getShowimage1()) {
            holder.image1.setVisibility(View.VISIBLE);
        } else {
            holder.image1.setVisibility(View.INVISIBLE);
        }

    }

public static class ViewHolder extends RecyclerView.ViewHolder {
        private ImageView imageView,imageView1;

        public ViewHolder(View view) {
            super(view);
            this.imageView = (ImageView) view.findViewById(R.id.imageView);
            this.imageView1 = (ImageView) view.findViewById(R.id.imageView1);

        }
    }
0 голосов
/ 09 апреля 2019

Вам просто нужно добавить поле в вашем адаптере, где вы будете сохранять текущий активный элемент. Затем позвоните notifyDataSetChanged. Также вы должны обновить ваш onBindViewHolder так:

private int currentPosition = -1;

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.textView.setText(items.get(position));
    if (currentPosition == position) {
        holder.img1.setVisibility(View.INVISIBLE);
        holder.img2.setVisibility(View.VISIBLE);
    } else {
        holder.img1.setVisibility(View.VISIBLE);
        holder.img2.setVisibility(View.INVISIBLE);
    }
}

public void setCurrentPosition(int currentPosition) {
    this.currentPosition = currentPosition;
}

Я создал тестовый проект, чтобы показать, как его можно реализовать. Здесь вы можете увидеть, как это работает. Здесь - мой github-репозиторий.

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

тогда вы должны написать логику на держателе привязки.

onBindHolder(ViewHolder holder, int position){
 if(position %2==0)
  imageview.setVisibility(View.Visible);
 else 
  imageview.setVisibility(View.InVisible);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...