Android-保持RecyclerView卡列表的状态
我是Android新手,我想创建一个包含卡片列表的活动。每个卡都有两个文本视图: 包含卡片文本的卡片 另一个包含整数 当我单击integer文本视图时,我希望整数的值减小到零 我实现了一个解决方案,但我有一个问题:当整数的值减小时,屏幕向横向旋转(例如)并不能保持新的值 以下是我使用CardView和RecyclerView的代码: 活动:Android-保持RecyclerView卡列表的状态,android,android-adapter,android-recyclerview,android-cardview,Android,Android Adapter,Android Recyclerview,Android Cardview,我是Android新手,我想创建一个包含卡片列表的活动。每个卡都有两个文本视图: 包含卡片文本的卡片 另一个包含整数 当我单击integer文本视图时,我希望整数的值减小到零 我实现了一个解决方案,但我有一个问题:当整数的值减小时,屏幕向横向旋转(例如)并不能保持新的值 以下是我使用CardView和RecyclerView的代码: 活动: public class CardsActivity extends AppCompatActivity { private RecyclerView m
public class CardsActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cards);
if (savedInstanceState != null) {
int i = 0;
}
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
mRecyclerView = (RecyclerView) findViewById(R.id.list_cards);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
Card[] myDataset ...// initialisation
mAdapter = new CardsAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_cards, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
适配器:
public class CardsAdapter extends RecyclerView.Adapter<CardsAdapter.ViewHolder> {
private Card[] mDataset;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
// each data item is just a string in this case
public TextView cardText;
public TextView cardCompteur;
public ViewHolder(View v) {
super(v);
cardText = (TextView) v.findViewById(R.id.text);
cardCompteur = (TextView) v.findViewById(R.id.counter);
cardCompteur.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v instanceof TextView) {
switch (v.getId()) {
case R.id.compteur:
final CharSequence compteur = cardCompteur.getText();
int cpt = Integer.parseInt(compteur.toString());
int position = (int) cardCompteur.getTag();
if (cpt > 1) {
cpt--;
cardCompteur.setText(String.valueOf(cpt));
} else if (cpt == 1) {
// we deactivate
cpt--;
cardCompteur.setText(String.valueOf(cpt));
cardText.setTextColor(Color.GRAY);
cardCompteur.setTextColor(Color.GRAY);
}
}
}
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public CardsAdapter(Card[] myDataset) {
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public CardsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.activity_main, parent, false);
// set the view's size, margins, paddings and layout parameters
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.cardText.setTag(position);
holder.cardText.setText(mDataset[position].getText());
holder.cardCompteur.setTag(position);
holder.cardCompteur.setText(String.valueOf(mDataset[position].getCompteur()));
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.length;
}
}
活动XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="wrap_content" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".CardsActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/list_cards"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" />
谢谢 您需要在捆绑包中利用并保存数据集。然后,您将保存的数据取出,并对其执行所需的操作
像这样的事情应该让你开始
public class TestActivity extends AppCompatActivity {
Card[] mCards;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cards);
// You put this here because onRestoreInstanceState won't be called on activity creation
if (savedInstanceState != null) {
mCards = savedInstanceState.getParcelable("myCards");
}
}
@Override
protected void onRestoreInstanceState(final Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// This is here because if you are recreating after an orientation change, for example, onCreate won't be called
if (savedInstanceState != null) {
mCards = savedInstanceState.getParcelable("myCards");
}
}
@Override
protected void onResume() {
super.onResume();
// You need to probably check for null here
mAdapter = new CardsAdapter(mCards);
mRecyclerView.setAdapter(mAdapter);
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelableArray("myCards", mCards);
}
}
在Card类中,您需要实现Parcelable
public class Card implements Parcelable {
private String text;
private int count;
public Card(String text, int count) {
this.text = text;
this.count = count;
}
// Some getters and possibly setters
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(final Parcel dest, final int flags) {
dest.writeString(this.text);
dest.writeInt(this.count);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public Card createFromParcel(Parcel in) {
return new Card(in.readString(), in.readInt());
}
@Override
public Card[] newArray(final int size) {
return new Card[size];
}
};
}