【发布时间】:2016-10-24 09:14:14
【问题描述】:
我在每个列表项中有一个带有计数器的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 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;
}
}
【问题讨论】:
-
你是什么意思“媒体迷路了”?
-
说我已经接触到一个期望它运行 longClickEvent 的项目,但是在 longClick 超时之前,会发生一个倒计时更新回调,该回调会更新所有视图的计数。在这种状态下,longclick 事件不会触发
-
你的刷新率低于300ms?你为什么不让它更长呢?
-
你介意用你的适配器代替吗?
-
我已经共享了我的适配器
标签: android android-recyclerview notifydatasetchanged long-press