【发布时间】:2018-07-25 08:25:39
【问题描述】:
我有一个包含 3 个片段选项卡的活动,您可以在它们之间切换。这些片段中的每一个都有一个 RecyclerView,单击时在其中选择/突出显示项目。这是通过我的自定义 RecyclerView 适配器中的onBindViewHolder 中的holder.setSelected(true) 完成的。
问题是当我在三个片段之间切换时,所选项目在看不见时被删除。我尝试将 RecyclerView 的状态保存在 onPause 并在 onResume 中恢复它,但这不起作用。
如何正确保存和检索所选项目?
这是我的自定义 RecyclerView 适配器(interface OnItemClickListener 在我当前的版本中没有使用):
public class ExerciseAdapter extends RecyclerView.Adapter<ExerciseAdapter.ExerciseViewHolder> {
private String[] mExampleList;
private OnItemClickListener mListener;
public interface OnItemClickListener {
}
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
public static class ExerciseViewHolder extends RecyclerView.ViewHolder {
private TextView mTextView1;
private ImageView mImageView;
CardView mCardView;
public ExerciseViewHolder(View itemView, final OnItemClickListener listener) {
super(itemView);
mTextView1 = itemView.findViewById(R.id.textViewExercise);
mImageView = itemView.findViewById(R.id.imageView);
}
void setSelected(boolean selected){
mTextView1.setSelected(selected);
}
}
public ExerciseAdapter(String[] exampleList) {
mExampleList = exampleList;
}
@NonNull
@Override
public ExerciseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.exercise_item,parent,false);
ExerciseViewHolder evh = new ExerciseViewHolder(v, mListener);
return evh;
}
@Override
public void onBindViewHolder(@NonNull final ExerciseViewHolder holder, final int position) {
holder.mTextView1.setText(mExampleList[position]);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.setSelected(true);
Day1Activity.setTimer();
}
});
holder.mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.setSelected(false);
}
});
}
@Override
public int getItemCount() {
return mExampleList.length;
}
这是包含 RecyclerView 的片段之一:
public class Frag1 extends Fragment {
private RecyclerView mRecyclerView;
private ExerciseAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private View rootView;
DataModel dataModel = new DataModel();
String[] exercises = dataModel.C_lifts();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.frag1_layout, container, false);
buildRecyclerView();
return rootView;
}
private void buildRecyclerView() {
mRecyclerView = rootView.findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getContext());
mAdapter = new ExerciseAdapter(exercises);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
}
使用 ViewPager 处理 Fragments 的 Activity:
public class Day1Activity extends AppCompatActivity {
private static CountDownTimer countDownTimer;
private static TextView textViewTimer;
private static final String TAG = "Activity";
private SectionsPageAdapter mSectionsPageAdapter;
private ViewPager mViewPager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.day1_layout);
mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());
mViewPager = findViewById(R.id.viewPagerContainer);
setupViewPager(mViewPager);
TabLayout tabLayout = findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
Toolbar toolbar = findViewById(R.id.toolBar);
setSupportActionBar(toolbar);
textViewTimer = findViewById(R.id.textViewTimer);
}
private void setupViewPager(ViewPager viewPager) {
int weekNumber = MainActivity.getWeekNumber();
String frag1Title = "C-S";
String frag2Title = "C-B";
String frag3Title;
if(weekNumber < 5) {
frag3Title = "Rack Pulls";
} else {
frag3Title = "2ct Paused Deadlift";
}
SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
adapter.addFragment(new Frag1(),frag1Title);
adapter.addFragment(new Frag2(),frag2Title);
adapter.addFragment(new Frag3(),frag3Title);
viewPager.setAdapter(adapter);
}
public static void setTimer() {
if (countDownTimer != null) {
countDownTimer.cancel();
}
countDownTimer = new CountDownTimer(240*1000, 1000) {
public void onTick(long millisUntilFinished) {
textViewTimer.setText("Seconds remaining: " + millisUntilFinished/1000);
}
public void onFinish() {
textViewTimer.setText("Time is up!");
}
}.start();
}
非常感谢任何帮助!谢谢
【问题讨论】:
标签: android android-fragments android-recyclerview