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;
...
然后,更新程序代码变成: