问题:如果用户单击Google入门应用程序之类的上一个按钮,如何重新获得所有以前的刷卡?
说明:
假设我有10张卡片。 001,002 ... 010。现在我开始刷卡。我刷了001、002和003,所以我目前看到的是004。现在我单击了上一个按钮。因此它显示003,这是正确的。
此后可能会发生两个用例:
1:假设我单击了上一个按钮,因此它应该显示002,但未显示。
2:假设我单击了下一个按钮,因此它应该再次显示004,这也显示并且正确,但是现在我又单击了上一个按钮,但这次却不显示003!
Google入门读物示例图片:enter image description here
我在项目中尝试了这个库类,因为我不想在项目中添加依赖项:https://github.com/flschweiger/SwipeStack
滑动堆栈适配器:
public class SwipeStackAdapter extends BaseAdapter {
public static final String TAG = SwipeStackAdapter.class.getSimpleName();
private List<String> mData;
public SwipeStackAdapter(List<String> data) {
this.mData = data;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public String getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card, parent, false);
TextView textViewCard = convertView.findViewById(R.id.textViewCard);
textViewCard.setText(mData.get(position));
return convertView;
}
private void showLog(String msg) {
Log.d(TAG, msg);
}
}
我在SwipeStack.java中找到了此方法:
private void addNextView() {
if (mCurrentViewIndex < mAdapter.getCount()) {
View bottomView = mAdapter.getView(mCurrentViewIndex, null, this);
bottomView.setTag(R.id.new_view, true);
if (!mDisableHwAcceleration) {
bottomView.setLayerType(LAYER_TYPE_HARDWARE, null);
}
if (mViewRotation > 0) {
bottomView.setRotation(mRandom.nextInt(mViewRotation) - (mViewRotation / 2));
}
int width = getWidth() - (getPaddingLeft() + getPaddingRight());
int height = getHeight() - (getPaddingTop() + getPaddingBottom());
LayoutParams params = bottomView.getLayoutParams();
if (params == null) {
params = new LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
}
int measureSpecWidth = MeasureSpec.AT_MOST;
int measureSpecHeight = MeasureSpec.AT_MOST;
if (params.width == LayoutParams.MATCH_PARENT) {
measureSpecWidth = MeasureSpec.EXACTLY;
}
if (params.height == LayoutParams.MATCH_PARENT) {
measureSpecHeight = MeasureSpec.EXACTLY;
}
bottomView.measure(measureSpecWidth | width, measureSpecHeight | height);
addViewInLayout(bottomView, 0, params, true);
mCurrentViewIndex++;
}
}
添加了DisplayCardActivity:这是显示卡片的主页:
import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.jimmytrivedi.getbasisdemo.Adapter.SwipeStackAdapter;
import com.jimmytrivedi.getbasisdemo.Class.FetchDataFromUriAsyncTask;
import com.jimmytrivedi.getbasisdemo.Class.SwipeStack;
import com.jimmytrivedi.getbasisdemo.Listener.JSONDataListener;
import com.jimmytrivedi.getbasisdemo.R;
import java.util.ArrayList;
import butterknife.BindView;
import butterknife.ButterKnife;
public class DisplayCardActivity extends AppCompatActivity implements SwipeStack.SwipeStackListener, View.OnClickListener, JSONDataListener {
public static final String TAG = DisplayCardActivity.class.getSimpleName();
@BindView(R.id.previous)
ImageButton mPrevious;
@BindView(R.id.next)
ImageButton mNext;
@BindView(R.id.swipe_stack)
SwipeStack mSwipeStack;
@BindView(R.id.fab)
FloatingActionButton mFAB;
@BindView(R.id.card_progress)
TextView cardProgress;
private FetchDataFromUriAsyncTask dataFromUriAsyncTask;
private SwipeStackAdapter mAdapter;
private ProgressDialog progressDialog;
private ArrayList<String> mData;
private ArrayList<String> mTempData = new ArrayList();
private int mCurrentCardPosition = 1, lastSwipedPosition = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_card);
init();
}
private void init() {
ButterKnife.bind(this);
setClickListener();
dataFromUriAsyncTask = new FetchDataFromUriAsyncTask(this, this);
dataFromUriAsyncTask.setJSONDataListener(this);
progressDialog = new ProgressDialog(this);
loadDataFromUrl();
}
private void setClickListener() {
mPrevious.setOnClickListener(this);
mNext.setOnClickListener(this);
mFAB.setOnClickListener(this);
}
private void loadDataFromUrl() {
//Showing progress dialog
progressDialog.setMessage("Fetching Data from...");
progressDialog.setCancelable(false);
progressDialog.show();
dataFromUriAsyncTask.execute();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.previous:
//lastSwipedPosition=lastSwipedPosition-1;
showLog("lastSwipedPosition: " + lastSwipedPosition);
if (lastSwipedPosition != -1) {
mTempData.clear();//clear all data
for (int i = lastSwipedPosition; i < mData.size(); i++) {
mTempData.add(mData.get(i));
}
mSwipeStack.resetStack();
// mSwipeStack.setCurrentViewIndex(lastSwipedPosition+3);
} else {
showToast("hide", Toast.LENGTH_SHORT);
}
break;
case R.id.next:
mSwipeStack.swipeTopViewToRight();
break;
case R.id.fab:
mSwipeStack.resetStack();
if (mData != null)
cardProgress.setText("1 Out of " + mData.size());
break;
}
}
@Override
public void onViewSwipedToLeft(int position) {
mCurrentCardPosition = position + 2;
setCurrentCardPosition(mCurrentCardPosition);
lastSwipedPosition = position;
}
@Override
public void onViewSwipedToRight(int position) {
mCurrentCardPosition = position + 2;
setCurrentCardPosition(mCurrentCardPosition);
lastSwipedPosition = position;
}
@Override
public void onStackEmpty() {
cardProgress.setText("No card in stack");
}
@Override
public void onClickData(ArrayList<String> getData) {
getData.clear();
getData.add("001");
getData.add("002");
getData.add("003");
getData.add("004");
getData.add("005");
getData.add("006");
getData.add("007");
getData.add("008");
getData.add("009");
getData.add("010");
// Dismiss the progress dialog
if (progressDialog.isShowing())
progressDialog.dismiss();
mData = new ArrayList<>(getData);
mTempData.addAll(mData);
setCurrentCardPosition(mCurrentCardPosition);
mAdapter = new SwipeStackAdapter(mTempData);
mSwipeStack.setAdapter(mAdapter);
mSwipeStack.setListener(this);
}
@Override
public void onJSONParsingError(String error) {
if (progressDialog.isShowing())
progressDialog.dismiss();
showToast(getString(R.string.user_error), Toast.LENGTH_LONG);
}
private void showToast(String message, int length) {
Toast.makeText(this, message, length).show();
}
private void showLog(String msg) {
Log.d(TAG, msg);
}
private void setCurrentCardPosition(int currentPosition) {
cardProgress.setText(currentPosition + " Out of " + mData.size());
}
}
您可以列出已刷过的左张卡片。当您想堆叠回去时,只需将这些卡添加到主列表中并通知适配器
// Make a list
private ArrayList<String> mData = new Arraylist();
// make a list
private ArrayList<String> mTempData = new Arraylist();
@Override
public void onViewSwipedToRight(int position) {
mTempData.add(mData.get(position));
}
@Override
public void onViewSwipedToLeft(int position) {
mTempData.add(mData.get(position));
}
当用户按下上一个按钮时,将mTempData放入mData列表。通过
通知栈 mSwipeStack.resetStack();
编辑
//添加新变量以保存上一个滑动位置
int lastSwipedPosition=0;
//现在填写临时表中的所有数据,并在适配器中使用临时表
mTempData.addAll(mData);
//更改回调方法
@Override
public void onViewSwipedToRight(int position) {
lastSwipedPosition=position;
}
@Override
public void onViewSwipedToLeft(int position) {
lastSwipedPosition=position;
}
//现在单击上一个或重置按钮,以及从上一个滑动位置到最大位置的循环开始
mTempData.clear();//clear all data
for(int i=lastSwipedPosition;i<mData.size()i++){
mTempData.add(mData.get(i));
}
mSwipeStack.resetStack();
//添加新变量以保存上一个滑动位置
int lastSwipedPosition=-1;
//主列表
private ArrayList<String> mData = new Arraylist();
//临时列表
private ArrayList<String> mTempData = new Arraylist();
//现在填写临时表中的所有数据,并在适配器中使用临时表
mTempData.addAll(mData);
//回调方法
@Override
public void onViewSwipedToRight(int position) {
lastSwipedPosition=position;
}
@Override
public void onViewSwipedToLeft(int position) {
lastSwipedPosition=position;
}
//单击上一个按钮并返回上一个,我们将从lastSwipedPosition中减去1以显示上一张已刷卡。
> Edited
lastSwipedPosition=lastSwipedPosition-1;
if(lastSwipedPosition!=-1){
mTempData.clear();//clear all data
for(int i=lastSwipedPosition;i<mData.size()i++){
mTempData.add(mData.get(i));
}
mSwipeStack.resetStack();
}else{ hide previous button }
//添加新变量以保存上一个滑动位置
int lastSwipedPosition=0;
//主列表和临时列表
private ArrayList<String> mData = new Arraylist();
private ArrayList<String> mTempData = new Arraylist();
//现在将所有数据填写到临时列表中,并在适配器中使用temp`
`mTempData.addAll(mData);
mAdapter = new SwipeStackAdapter(mTempData);
mSwipeStack.setAdapter(mAdapter);
//回调方法
@Override
public void onViewSwipedToRight(int position) {
lastSwipedPosition=position+1;
}
@Override
public void onViewSwipedToLeft(int position) {
lastSwipedPosition=position+1;
}
//单击上一个按钮,并返回上一个,我们将从lastSwipedPosition中减去1以显示上一张已刷卡。
lastSwipedPosition = lastSwipedPosition - 1;
if (lastSwipedPosition >= 0) {
mTempData.clear();//clear all data
for (int i = lastSwipedPosition; i < mData.size(); i++) {
mTempData.add(mData.get(i));
}
mSwipeStack.resetStack();
if (lastSwipedPosition == 0){
Toast.makeText(this, "hide back button", Toast.LENGTH_SHORT).show();
}
} else {
lastSwipedPosition = 0;
}