android-RecyclerView每秒更新一次,并有一个longPressListener

android-RecyclerView每秒更新一次,并有一个longPressListener,android,android-recyclerview,notifydatasetchanged,long-press,Android,Android Recyclerview,Notifydatasetchanged,Long Press,我有一个RecyclerView,每个列表项中都有一个计数器,当调用计数器回调时,它会更新相关字段并调用nottifyDataSetChanged 它工作得很好,但问题是,我也有一个很长的新闻侦听器连接到它,因为数据是更新的,而用户按项目,新闻是丢失的 我怎么办 更新程序代码: public void setCountDown(int countDown){ mCountDown = countDown; notifyDataSetChanged(); } holder

我有一个
RecyclerView
,每个列表项中都有一个计数器,当调用计数器回调时,它会更新相关字段并调用
nottifyDataSetChanged

它工作得很好,但问题是,我也有一个很长的新闻侦听器连接到它,因为数据是更新的,而用户按项目,新闻是丢失的

我怎么办

更新程序代码:

public void setCountDown(int countDown){
    mCountDown = countDown;
    notifyDataSetChanged();
}
    holder.container.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            FragmentManager fm = ((AppCompatActivity)activity).getSupportFragmentManager();
            EditAccountFragment editAccountFragmentDialog = EditAccountFragment.newInstance(_id);
            editAccountFragmentDialog.show(fm, "fragment_edit_account");

            return false;
        }
    });
长时间单击侦听器:

public void setCountDown(int countDown){
    mCountDown = countDown;
    notifyDataSetChanged();
}
    holder.container.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            FragmentManager fm = ((AppCompatActivity)activity).getSupportFragmentManager();
            EditAccountFragment editAccountFragmentDialog = EditAccountFragment.newInstance(_id);
            editAccountFragmentDialog.show(fm, "fragment_edit_account");

            return false;
        }
    });
根据请求添加适配器

public class AccountAdapter extends RecyclerView.Adapter<AccountAdapter.ItemViewHolder> {

    private static final String TAG = "ITEM_ADAPTER";

    private Cursor itemCursor;
    private Activity activity;
    private ItemColumnIds feedColumnIds;
    private int mCountDown;
    private boolean ignoreDatasetChange = false;

    /**
     * initilaizer for recycler view adapter, takes in activity although better way is to handle
     * activity related tasks within activiyt, but this is just done to speed up the overall process
     * @param activity
     */
    public AccountAdapter(Activity activity){
        this.activity = activity;
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(activity).inflate(R.layout.account_item,
                parent, false);

        feedColumnIds = new ItemColumnIds();

        if (itemCursor != null){
            // initilize column indices information
            feedColumnIds.colId = itemCursor.getColumnIndex(
                    AuthContract.AccountEntry._ID);
            feedColumnIds.colAcctId = itemCursor.getColumnIndex(
                    AuthContract.AccountEntry.COLUMN_USERNAME);
            feedColumnIds.colPin = itemCursor.getColumnIndex(
                    AuthContract.AccountEntry.COLUMN_PIN);
            feedColumnIds.colIssuer = itemCursor.getColumnIndex(
                    AuthContract.AccountEntry.COLUMN_ISSUER);
        }

        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ItemViewHolder holder, int position) {

        if(itemCursor == null)
            return;

        if(!itemCursor.moveToPosition(position))
            return;

        //get values from cursor
        String pin = itemCursor.getString(feedColumnIds.colPin);
        String email = itemCursor.getString(feedColumnIds.colAcctId);
        String issuer = itemCursor.getString(feedColumnIds.colIssuer);
        final long _id = itemCursor.getLong(feedColumnIds.colId);


        //set view values
        holder.tvEmail.setText(email);
        holder.tvPin.setText(pin);
        holder.tvIssuer.setText(issuer);
        holder.apCountDown.setProgress(mCountDown);

        holder.container.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String pin = holder.tvPin.getText().toString();
                ClipboardManager clipboard = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData clip = ClipData.newPlainText("Secret Key", pin);
                clipboard.setPrimaryClip(clip);

                Toast.makeText(activity, "OTP code "+ pin +" copied to clipboard", Toast.LENGTH_SHORT).show();

            }
        });

        holder.container.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                FragmentManager fm = ((AppCompatActivity)activity).getSupportFragmentManager();
                EditAccountFragment editAccountFragmentDialog = EditAccountFragment.newInstance(_id);
                editAccountFragmentDialog.show(fm, "fragment_edit_account");

                return false;
            }

        });

    }

    @Override
    public int getItemCount() {
        if(itemCursor == null)
            return 0;
        return itemCursor.getCount();
    }



    /**
     * close previurous cursor if any and replace that with the new on from host class
     * @param cursor
     */
    public void swapCursor(Cursor cursor) {
        if(itemCursor != null) {
            itemCursor.close();
            itemCursor = null;
        }

        itemCursor = cursor;
        notifyDataSetChanged();

    }

    public void setCountDown(int countDown){
        mCountDown = countDown;

        if(!ignoreDatasetChange)
            notifyDataSetChanged();
    }

    /**
     * View golder for auction item entry
     */
    public class ItemViewHolder extends RecyclerView.ViewHolder {
        TextView tvEmail;
        TextView tvPin;
        TextView tvIssuer;
//        TextView tvCountDown;
        ArcProgress apCountDown;
        View container;

        public ItemViewHolder(View itemView) {
            super(itemView);
            tvEmail = (TextView) itemView.findViewById(R.id.tv_email);
            tvPin = (TextView) itemView.findViewById(R.id.tv_pin);
            tvIssuer = (TextView) itemView.findViewById(R.id.tv_issuer);
            apCountDown = (ArcProgress) itemView.findViewById(R.id.arc_progress);
            container = itemView.findViewById(R.id.container);
        }
    }

    /**
     * databse column id holder for auction item
     */
    class ItemColumnIds {

        public int colId;
        public int colPin;
        public int colAcctId;
        public int colIssuer;

    }

}
公共类AccountAdapter扩展了RecyclerView.Adapter{ 私有静态最终字符串TAG=“ITEM_ADAPTER”; 私有游标项游标; 私人活动; 私有ItemColumnId feedColumnId; 私人国际货币基金组织; 私有布尔值ignoreDatasetChange=false; /** *recycler视图适配器的初始化器接受活动,尽管更好的方法是处理 *ActivityT中与活动相关的任务,但这样做只是为了加快整个流程 *@param活动 */ 公共帐户适配器(活动){ 这个。活动=活动; } @凌驾 public ItemViewHolder onCreateViewHolder(视图组父级,int-viewType){ 查看视图=布局从(活动)开始变平。充气(R.layout.account\u项目, 父母,假); FeedColumnId=新的ItemColumnId(); if(itemCursor!=null){ //初始化列索引信息 FeedColumnId.colId=itemCursor.getColumnIndex( AuthContract.AccountEntry.\u ID); feedColumnId.colAcctId=itemCursor.getColumnIndex( AuthContract.AccountEntry.COLUMN\u用户名); feedColumnIds.colPin=itemCursor.getColumnIndex( AuthContract.AccountEntry.COLUMN\u PIN); feedColumnId.colIssuer=itemCursor.getColumnIndex( AuthContract.AccountEntry.COLUMN\u发行人); } 返回新的ItemViewHolder(视图); } @凌驾 public void onBindViewHolder(最终ItemViewHolder,int位置){ if(itemCursor==null) 返回; 如果(!itemCursor.moveToPosition(位置)) 返回; //从游标获取值 String pin=itemCursor.getString(feedColumnId.colPin); String email=itemCursor.getString(feedColumnId.colAcctId); 字符串颁发者=itemCursor.getString(feedColumnId.colIssuer); final long _id=itemCursor.getLong(feedColumnIds.colId); //设置视图值 holder.tvEmail.setText(电子邮件); 夹持器.tvPin.setText(针); holder.tVISUER.setText(发行人); holder.apCountDown.setProgress(mCountDown); holder.container.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ 字符串pin=holder.tvPin.getText().toString(); ClipboardManager剪贴板=(ClipboardManager)activity.getSystemService(Context.clipboard\u服务); clipdataclip=ClipData.newPlainText(“密钥”,pin); 剪贴板.setPrimaryClip(clip); Toast.makeText(活动,“OTP代码”+pin+“复制到剪贴板”,Toast.LENGTH_SHORT.show(); } }); holder.container.setOnLongClickListener(新视图.OnLongClickListener(){ @凌驾 仅长按公共布尔值(视图v){ FragmentManager fm=((AppCompatActivity)活动)。getSupportFragmentManager(); EditAccountFragment editAccountFragmentDialog=EditAccountFragment.newInstance(_id); editAccountFragmentDialog.show(fm,“fragment_edit_account”); 返回false; } }); } @凌驾 public int getItemCount(){ if(itemCursor==null) 返回0; 返回itemCursor.getCount(); } /** *关闭上一个游标(如果有),并将其替换为新的on-from主机类 *@param游标 */ 公共无效交换光标(光标){ if(itemCursor!=null){ itemCursor.close(); itemCursor=null; } itemCursor=游标; notifyDataSetChanged(); } 公共无效设置倒计时(整数倒计时){ mCountDown=倒计时; 如果(!ignoreDatasetChange) notifyDataSetChanged(); } /** *查看golder以进入拍卖项目 */ 公共类ItemViewHolder扩展了RecyclerView.ViewHolder{ TextView-tvmail; 文本视图tvPin; 文本视图; //文本视图电视倒计时; 电弧降下; 视图容器; 公共项目视图持有者(查看项目视图){ 超级(项目视图); TveEmail=(TextView)itemView.findViewById(R.id.tv_email); tvPin=(TextView)itemView.findViewById(R.id.tv_-pin); TVISUER=(TextView)itemView.findViewById(R.id.tv_issuer); apCountDown=(ArcProgress)itemviewbyd(R.id.arc\u progress); container=itemView.findviewbyd(R.id.container); } } /** *拍卖项目的数据库列id持有者 */ 类ItemColumnId{ 公共int colId; 公共int colPin; 公共国际科拉克提德; 公共国际合作组织; } }

> p>我认为当用户触摸视图时,应该考虑停止快速刷新。

要做到这一点,您只需实现
onTouchEvent
,并在检测到MotionEvent.ACTION\u DOWN时设置一个标志

...
if (event.getAction()==MotionEvent.ACTION_DOWN) isUserTouching = true;
if (event.getAction()==MotionEvent.ACTION_UP) isUserTouching = false;
...
然后,更新程序代码变为:

public void setCountDown(int countDown){
   if (!isUserTouching) {
      mCountDown = countDown;
      notifyDataSetChanged();
   }
}

<>我想你应该考虑在用户触摸视图时停止快速刷新。

要做到这一点,您只需实现
onTouchEvent
,并在检测到MotionEvent.ACTION\u DOWN时设置一个标志

...
if (event.getAction()==MotionEvent.ACTION_DOWN) isUserTouching = true;
if (event.getAction()==MotionEvent.ACTION_UP) isUserTouching = false;
...
然后,更新程序代码变成: