2016-12-25 3 views
3

В моем recyclerview я установил изображение (в строке recyclerview) видимым или не видимым в соответствии с некоторым условием.Изображение в строке recyclerview исчезает после вращения

Однако после того, как я повернуть экран изображение исчезает, как сделать так, чтобы изображение видимым на `s положение в recyclerview после вращающегося экрана?

Спасибо за вашу помощь и счастливых праздников;)

Я использую реализацию SimpleAdapter.

public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.SimpleViewHolder> implements FollowRedirectsCallback { 

public static class SimpleViewHolder extends RecyclerView.ViewHolder { 
     ... 
     public final View icCancel; 

     public SimpleViewHolder(View view) { 
      super(view); 
      ... 
      icCancel = view.findViewById(R.id.icCancel); 
     } 
    } 

    public SimpleAdapter(Context context, String[] data, long userId, int dlTypeValue) { 
     mContext = context; 
     userID = userId; 
     DLTypeValue = dlTypeValue; 
     if (data != null) 
      mData = new ArrayList<String>(Arrays.asList(data)); 
     else mData = new ArrayList<String>(); 
    } 

    public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     final View view = LayoutInflater.from(mContext).inflate(R.layout.simple_item, parent, false); 
     return new SimpleViewHolder(view); 
    } 

@Override 
    public void onBindViewHolder(final SimpleViewHolder holder, final int position) { 
    ... 
    // How to keep this image visible after rotation of the screen? 
    if (somecondition) { 
     holder.icCancel.setVisibility(View.VISIBLE); 
    } 
} 

EDIT: Я initialze мой адаптер в corresponsent в деятельности:

public class DownloadsActivity extends BaseActivity { 

    RecyclerView recyclerView; 
    Parcelable state; 
    SimpleAdapter mAdapter; 
    SimpleSectionedRecyclerViewAdapter mSectionedAdapter; 
    SimpleSectionedRecyclerViewAdapter.Section[] dummy; 

@AfterViews 
    public void init() { 
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

     //setLayout Manager 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(linearLayoutManager); 
     recyclerView.setHasFixedSize(true); 

     dummy = new SimpleSectionedRecyclerViewAdapter.Section[sections.size()]; 
     mSectionedAdapter = new 
       SimpleSectionedRecyclerViewAdapter(this, R.layout.section, R.id.section_text, mAdapter); 
     mSectionedAdapter.setSections(sections.toArray(dummy)); 


     //Apply this adapter to the RecyclerView 
     recyclerView.setAdapter(mSectionedAdapter); 
    } 

@Override 
protected void onPause() { 
    super.onPause(); 
    // save RecyclerView state 
    state = recyclerView.getLayoutManager().onSaveInstanceState(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (inProgress) { 
     progresstxt.setVisibility(View.VISIBLE); 
     downloadprogress.setVisibility(View.VISIBLE); 
    } 

    // restore RecyclerView state 
    recyclerView.getLayoutManager().onRestoreInstanceState(state); 
} 

} 
+0

попробуйте добавить андроид: configChanges = "ориентация | Размер экрана" в вашей деятельности в вопросе в манифесте. –

+0

Привет, Брэдли, я сделал это уже в манифесте, так как я собрал некоторую информацию, как решить, но это не поможет. – Simon

+0

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

ответ

3

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

public class YourActivity extends BaseActivity { 
    /* some codes */ 

    // possible values are: VISIBLE, INVISIBLE, or GONE 
    private ArrayList<Integer> imagesState = new ArrayList<>(); 

    /* some codes */ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     if(savedInstanceState != null) { 
      imagesState = savedInstanceState.getIntegerArrayList("key"); 
     } 

     // Pass the imagesState to the adapter as a parameter here 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putIntegerArrayList("key", imagesState); 
    } 

    /* some codes */ 
} 

Затем в адаптер:

public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.SimpleViewHolder> implements FollowRedirectsCallback { 

    /* some codes */ 

    public SimpleAdapter(Context context, String[] data, long userId, int dlTypeValue, ArrayList<Integer> imagesState) { 
     /* some codes */ 
     this.imagesState = imagesState; 
    } 

    @Override 
    public void onBindViewHolder(SimpleViewHolder holder, int position) { 
     /* some codes */ 

     if (imagesState.get(position) == View.VISIBLE) 
      holder.icCancel.setVisibility(View.VISIBLE); 
     else if(imagesState.get(position) == View.INVISIBLE) 
      holder.icCancel.setVisibility(View.INVISIBLE); 
     else 
      holder.icCancel.setVisibility(View.GONE); 
    } 
} 
+0

Это, кажется, хорошая идея, я заполнил arraylist, как, imagesState.add (View.VISIBLE); etc, но holder.icCancel.setVisibility (imagesState.get (позиция)); говорит, должен быть один из View.VISIBLE и т. д.? Не могли бы вы немного разобраться, как это работает? – Simon

+0

Извините @Simon Я не проверял свой ответ в Android Studio. Я отредактировал ответ. –

+0

Great Janice, many thx. – Simon

0

использование

int position = recyclerView.getLayoutManager().findFirstVisibleItemPosition(); 

, чтобы получить первую позицию видимой. затем просто выделите позицию

recyclerView.getLayoutManager().scrollToPosition(<position of interest>); 

 Смежные вопросы

  • Нет связанных вопросов^_^