首页 > 解决方案 > 如何管理刷卡次数?

问题描述

我正在从这里实现 Swipe 堆栈演示。现在我想跟踪刷卡的进度。我已经制定了自己的逻辑,并且运行良好。但我还有一个功能,即在单击上一个按钮时,用户可以以相反的顺序一张一张地看到所有刷过的卡。

但是在这种情况下,我的刷卡进度堆栈不起作用。我怎样才能做到这一点?

解释:不是刷卡总数,但我目前看到的是哪一张卡,比如 4 Out of 10

显示卡活动:

package com.jimmytrivedi.cardswipedemo.Activity;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.jimmytrivedi.cardswipedemo.Adapter.SwipeStackAdapter;
import com.jimmytrivedi.cardswipedemo.Data.FetchDataFromUriAsyncTask;
import com.jimmytrivedi.cardswipedemo.Listener.JSONDataListener;
import com.jimmytrivedi.cardswipedemo.R;
import com.jimmytrivedi.cardswipedemo.View.SwipeStack;

import java.util.ArrayList;

import butterknife.BindView;
import butterknife.ButterKnife;

public class DisplayCardActivity extends BaseActivity 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 ProgressDialog progressDialog;
    private ArrayList<String> mData;
    private ArrayList<String> mTempData;
    private int mCurrentCardPosition = 1, lastSwipedPosition = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState);
        init();
    }

    @Override
    protected int getLayoutResource() {
        return R.layout.activity_display_card;
    }

    private void init() {
        ButterKnife.bind(this);
        setClickListener();
        mTempData = new ArrayList<>();
        mPrevious.setEnabled(false);
        mPrevious.setColorFilter(getResources().getColor(R.color.colorGray));
        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();
    }

    private void changePreviousButtonStatus(int positionValue) {
        if (lastSwipedPosition == positionValue) {
            mPrevious.setEnabled(false);
            mPrevious.setColorFilter(getResources().getColor(R.color.colorGray));
        } else {
            mPrevious.setEnabled(true);
            mPrevious.setColorFilter(getResources().getColor(R.color.colorBlack));
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.previous:
                changePreviousButtonStatus(1);
                lastSwipedPosition = lastSwipedPosition - 1;
                if (lastSwipedPosition >= 0) {
                    mTempData.clear();
                    for (int i = lastSwipedPosition; i < mData.size(); i++) {
                        mTempData.add(mData.get(i));
                    }
                    mSwipeStack.resetStack();
                    setCurrentCardPosition(lastSwipedPosition);
                } else {
                    lastSwipedPosition = 0;
                }

                break;

            case R.id.next:
                changePreviousButtonStatus(1);
                mSwipeStack.swipeTopViewToRight();
                break;

            case R.id.fab:
                mPrevious.setEnabled(false);
                mPrevious.setColorFilter(getResources().getColor(R.color.colorGray));
                lastSwipedPosition = 0;
                mTempData.clear();
                mTempData.addAll(mData);
                mSwipeStack.resetStack();
                if (mData != null)
                    cardProgress.setText(getResources().getString(R.string.default_count) + mData.size());
                break;
        }
    }

    @Override
    public void onViewSwipedToLeft(int position) {
        mCurrentCardPosition = position + 2;
        setCurrentCardPosition(mCurrentCardPosition);
        lastSwipedPosition = position + 1;
        changePreviousButtonStatus(0);
    }

    @Override
    public void onViewSwipedToRight(int position) {
        mCurrentCardPosition = position + 2;
        setCurrentCardPosition(mCurrentCardPosition);
        lastSwipedPosition = position + 1;
        changePreviousButtonStatus(0);
    }

    @Override
    public void onStackEmpty() {
        cardProgress.setText("No card in stack");
    }


    @Override
    public void onClickData(ArrayList<String> getData) {
        // Dismiss the progress dialog
        if (progressDialog.isShowing())
            progressDialog.dismiss();


        mData = new ArrayList<>(getData);
        mTempData.addAll(mData);
        setCurrentCardPosition(mCurrentCardPosition);
        SwipeStackAdapter 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());
    }


}

适配器:

package com.jimmytrivedi.cardswipedemo.Adapter;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.jimmytrivedi.cardswipedemo.R;

import java.util.List;

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);
    }
}

问题:

用例:我有 10 张卡片(001、002..010)。总共有5件事。1. 向左滑动 2. 向右滑动 3. 上一个按钮 4. 下一个按钮 5. 重置按钮

如果我开始向右滑动 001 然后 002 现在我按下 003 和 004 的下一个按钮。现在我按下上一个按钮然后再次下一个和上一个。那个时间顺序没有维持。

标签: android

解决方案


你为什么在刷卡回调方法中这样做?

mCurrentCardPosition = 位置 + 2;

我认为这就是问题所在。

或者您可以使用当前位置调用此 setCurrentCardPosition()方法

@Override
public void onViewSwipedToLeft(int position) {
    mCurrentCardPosition = position + 2;
    setCurrentCardPosition(position);
    lastSwipedPosition = position + 1;
    changePreviousButtonStatus(0);
}

@Override
public void onViewSwipedToRight(int position) {
    mCurrentCardPosition = position + 2;
    setCurrentCardPosition(position);
    lastSwipedPosition = position + 1;
    changePreviousButtonStatus(0);
}

已编辑

int currentPosition = 1;

在列表中添加数据后

txtCardProgress.setText("1 out of " + mData.size());

在点击

@Override
public void onClick(View v) {
    if (v.equals(mButtonLeft)) {
        swipedLastPosition = swipedLastPosition - 1;
        currentPosition =currentPosition -1;
        if (swipedLastPosition >= 0) {
            mTempData.clear();//clear all data
            for (int i = swipedLastPosition; i < mData.size(); i++) {
                mTempData.add(mData.get(i));
            }
            mSwipeStack.resetStack();
            if (swipedLastPosition == 0) {
                Toast.makeText(this, "hide back button", Toast.LENGTH_SHORT).show();
            }
            currentPosition =currentPosition -1;
            setCardProgress(currentPosition);
        } else {
            swipedLastPosition = 0;
            currentPosition = 0;
            setCardProgress(currentPosition);
        }

    } else if (v.equals(mButtonRight)) {
        mSwipeStack.swipeTopViewToRight();
    } else if (v.equals(mFab)) {
        swipedLastPosition = 0;
        mTempData.clear();
        mTempData.addAll(mData);
        mSwipeStack.resetStack();
        setCardProgress(swipedLastPosition);
    }

回调方法

@Override
public void onViewSwipedToRight(int position) {
    swipedLastPosition = position + 1;
    setCardProgress(position);
}

@Override
public void onViewSwipedToLeft(int position) {
    swipedLastPosition = position;     
    setCardProgress(position);
}

更新进度方法

void setCardProgress(int position) {
    if (position == mData.size()-1) {
        currentPosition = mData.size();
        txtCardProgress.setText(currentPosition + " out of " + mData.size());
    } else {
        currentPosition++;
        txtCardProgress.setText(currentPosition + " out of " + mData.size());
    }
}

推荐阅读