Android RecyclerView Adapter notifyItemChanged()已在池中获取IllegalStateException [英] Android RecyclerView Adapter notifyItemChanged() getting IllegalStateException Already in the pool
问题描述
Iam使用Recyclerview并通过notifyItemChanged()更新它 使用linearlayoutmanager的recyclerView 当从套接字更新数据时,我通过适配器notifyItemChanged()更新了回收站 套接字每秒发送许多数据,这意味着我每秒调用适配器多次 它可以正常工作,但是在更新多次后会出现此错误
Iam using Recyclerview and update it by notifyItemChanged() recyclerView using linearlayoutmanager when data updated from socket i update recycler by adapter notifyItemChanged() socket send many data per second that mean i call adapter many times per second its working but when update it more times gives this error
Exception java.lang.IllegalStateException:已在池中! android.support.v7.widget.AdapterHelper.recycleUpdateOp(AdapterHelper.java:742) android.support.v7.widget.AdapterHelper.dispatchAndUpdateViewHolders(AdapterHelper.java:294) android.support.v7.widget.AdapterHelper.applyUpdate(AdapterHelper.java:220) android.support.v7.widget.AdapterHelper.preProcess(AdapterHelper.java:104) android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1696) android.support.v7.widget.RecyclerView $ 1.run(RecyclerView.java:346) android.view.Choreographer $ CallbackRecord.run(Choreographer.java:959) android.view.Choreographer.doCallbacks(Choreographer.java:734) android.view.Choreographer.doFrame(Choreographer.java:667) android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:945) android.os.Handler.handleCallback(Handler.java:751) android.os.Handler.dispatchMessage(Handler.java:95) android.os.Looper.loop(Looper.java:154) android.app.ActivityThread.main(ActivityThread.java:6776) java.lang.reflect.Method.invoke(Method.java) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1518) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
Exception java.lang.IllegalStateException: Already in the pool! android.support.v7.widget.AdapterHelper.recycleUpdateOp (AdapterHelper.java:742) android.support.v7.widget.AdapterHelper.dispatchAndUpdateViewHolders (AdapterHelper.java:294) android.support.v7.widget.AdapterHelper.applyUpdate (AdapterHelper.java:220) android.support.v7.widget.AdapterHelper.preProcess (AdapterHelper.java:104) android.support.v7.widget.RecyclerView.consumePendingUpdateOperations (RecyclerView.java:1696) android.support.v7.widget.RecyclerView$1.run (RecyclerView.java:346) android.view.Choreographer$CallbackRecord.run (Choreographer.java:959) android.view.Choreographer.doCallbacks (Choreographer.java:734) android.view.Choreographer.doFrame (Choreographer.java:667) android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:945) android.os.Handler.handleCallback (Handler.java:751) android.os.Handler.dispatchMessage (Handler.java:95) android.os.Looper.loop (Looper.java:154) android.app.ActivityThread.main (ActivityThread.java:6776) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1518) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1408)
我的适配器
public class Companies_Adapter extends
RecyclerView.Adapter<Companies_Adapter.ViewHolder> {
private View view;
boolean isFirstTime = false;
private ArrayList<Company> companies;
private Context context;
private LayoutInflater mInflater;
ArrayList<Company> arraylist;
public Companies_Adapter(ArrayList<Company> chat_items, Context context) {
this.companies = chat_items;
this.context = context;
mInflater = LayoutInflater.from(context);
arraylist = new ArrayList<>();
arraylist.addAll(chat_items);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public int getItemCount() {
return companies.size();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView LastTradePrice ,DailyHighPrice ,DailyLowPrice ,DiffLastPricePercent
,AskPrice ,AskVol ,BidPrice ,BidVol ,NameA,liquidity,liquidity_type,company_id ;
public ViewHolder(View itemView) {
super(itemView);
LastTradePrice = (TextView)itemView.findViewById(R.id.LastTradePrice);
DiffLastPricePercent = (TextView)itemView.findViewById(R.id.DiffLastPricePercent);
AskPrice= (TextView)itemView.findViewById(R.id.AskPrice);
AskVol = (TextView)itemView.findViewById(R.id.AskVol);
BidPrice = (TextView)itemView.findViewById(R.id.BidPrice);
BidVol = (TextView)itemView.findViewById(R.id.BidVol);
NameA = (TextView)itemView.findViewById(R.id.NameA);
liquidity = (TextView)itemView.findViewById(R.id.liquidity);
liquidity_type = (TextView)itemView.findViewById(R.id.liquidity_type);
DailyHighPrice = (TextView)itemView.findViewById(R.id.highpric);
DailyLowPrice = (TextView)itemView.findViewById(R.id.lowprice);
company_id = (TextView)itemView.findViewById(R.id.company_id);
}
@Override
public void onClick(View v) {
// this.itemClickListener.onItemClick(v, getLayoutPosition());
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.company_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
Typeface lightFace = Typeface.createFromAsset(context.getAssets(), "fonts/Arial-BoldMT.otf");
holder.company_id.setTextSize(TypedValue.TYPE_STRING,6);
holder.AskPrice.setTextSize(TypedValue.TYPE_STRING,6);
holder.DailyHighPrice.setTextSize(TypedValue.TYPE_STRING,6);
holder.DailyLowPrice.setTextSize(TypedValue.TYPE_STRING,6);
holder.AskVol.setTextSize(TypedValue.TYPE_STRING,6);
holder.BidPrice.setTextSize(TypedValue.TYPE_STRING,6);
holder.BidVol.setTextSize(TypedValue.TYPE_STRING,6);
holder.DiffLastPricePercent.setTextSize(TypedValue.TYPE_STRING,6);
holder.NameA.setTextSize(TypedValue.TYPE_STRING,7);
holder.liquidity.setTextSize(TypedValue.TYPE_STRING,7);
holder.liquidity_type.setTextSize(TypedValue.TYPE_STRING,6);
holder.LastTradePrice.setTextSize(TypedValue.TYPE_STRING,7);
holder.NameA.setTypeface(lightFace);
holder.liquidity.setTypeface(lightFace);
holder.LastTradePrice.setTypeface(lightFace);
NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
DecimalFormat precision = (DecimalFormat)nf;
precision.applyPattern("0.00");
if (companies.get(position).isChanged()) {
if(companies.get(position).isFirstTime()) {
holder.liquidity_type.setText(companies.get(position).getLiquidity_status());
if (companies.get(position).getLiquidity_status().equals("0.00")){
holder.liquidity_type.setTextColor(context.getResources().getColor(R.color.green));
}else {
if (companies.get(position).getLiquidity_status().equals("in")) {
holder.liquidity_type.setTextColor(context.getResources().getColor(R.color.green));
} else {
holder.liquidity_type.setTextColor(context.getResources().getColor(R.color.red));
}
}
holder.DailyHighPrice.setText(precision.format(Double.parseDouble(companies.get(position).getDailyHighPrice())));
holder.DailyLowPrice.setText(precision.format(Double.parseDouble(companies.get(position).getDailyLowPrice())));
holder.DailyLowPrice.setTextColor(context.getResources().getColor(R.color.red));
holder.DailyHighPrice.setTextColor(context.getResources().getColor(R.color.green));
holder.company_id.setText(companies.get(position).getStockCode());
if (companies.get(position).getLastTradePrice() != null) {
holder.LastTradePrice.setText(precision.format(Double.parseDouble(companies.get(position).getLastTradePrice())));
}
if (companies.get(position).getDiffLastPricePercent() != null) {
holder.DiffLastPricePercent.setText
(precision.format(Double.valueOf(companies.get(position)
.getDiffLastPricePercent())));
if (!companies.get(position).getDiffLastPricePercent().contains("-")) {
holder.DiffLastPricePercent.setTextColor(context.getResources().getColor(R.color.green));
holder.LastTradePrice.setTextColor(context.getResources().getColor(R.color.green));
holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.green));
new CountDownTimer(400, 50) {
@Override
public void onTick(long arg0) {
// TODO Auto-generated method stub
}
@Override
public void onFinish() {
holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.black));
companies.get(position).setChanged(false);
}
}.start();
} else {
holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.red));
new CountDownTimer(400, 50) {
@Override
public void onTick(long arg0) {
// TODO Auto-generated method stub
}
@Override
public void onFinish() {
holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.black));
companies.get(position).setChanged(false);
}
}.start();
holder.DiffLastPricePercent.setTextColor(context.getResources().getColor(R.color.red));
holder.LastTradePrice.setTextColor(context.getResources().getColor(R.color.orange));
}
}
if (companies.get(position).getAskPrice() != null)
holder.BidPrice.setText(precision.format(Double.parseDouble(companies.get(position).getAskPrice())));
if (companies.get(position).getAskVol() != null && !companies.get(position).getAskVol().equals(""))
holder.BidVol.setText(NumberFormat.getNumberInstance(Locale.US).format(Double.valueOf(
companies.get(position).getAskVol())));
if (companies.get(position).getBidPrice() != null)
holder.AskPrice.setText(companies.get(position).getBidPrice());
if (companies.get(position).getBidVol() != null && !companies.get(position).getBidVol().equals(""))
holder.AskVol.setText(NumberFormat.getNumberInstance(Locale.US).format(Double.valueOf(
companies.get(position).getBidVol())));
double thero = companies.get(position).getTermo();
holder.liquidity.setText(precision.format(thero));
if (thero >= 0.4 && thero < 0.8) {
holder.liquidity.setBackgroundResource(R.color.beige);
holder.liquidity.setTextColor(context.getResources().getColor(R.color.green_dark));
}
if (thero >= 0.8 && thero < 1.8) {
holder.liquidity.setBackgroundResource(R.color.yellow);
holder.liquidity.setTextColor(Color.BLUE);
}
if (thero >= 1.8 && thero < 2.8) {
holder.liquidity.setBackgroundColor(Color.BLUE);
holder.liquidity.setTextColor(Color.WHITE);
}
if (thero >= 2.8) {
holder.liquidity.setBackgroundResource(R.color.black);
holder.liquidity.setTextColor(context.getResources().getColor(R.color.gold));
}
if (thero < 0.4 && thero >= 0) {
holder.liquidity.setTextColor(Color.GREEN);
holder.liquidity.setBackgroundResource(R.color.black);
}
if (thero < 0) {
holder.liquidity.setTextColor(Color.RED);
holder.liquidity.setBackgroundResource(R.color.black);
}
holder.liquidity_type.setText(companies.get(position).getLiquidity_status());
if (companies.get(position).getNameA() != null)
holder.NameA.setText(companies.get(position).getNameA());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("aaaa");
intent.putExtra("name", companies.get(position).getNameA());
intent.putExtra("cprice", companies.get(position).getLastTradePrice());
intent.putExtra("cpercentage", companies.get(position).getDiffLastPricePercent());
intent.putExtra("openning_price", companies.get(position).getOpenning_price());
intent.putExtra("lower_price", companies.get(position).getDailyLowPrice());
intent.putExtra("deals", companies.get(position).getDeals_count());
intent.putExtra("value", companies.get(position).getValue());
intent.putExtra("higher", companies.get(position).getDailyHighPrice());
intent.putExtra("lastclose", companies.get(position).getLast_close());
intent.putExtra("size", companies.get(position).getSize());
intent.putExtra("point", companies.get(position).getCreation());
intent.putExtra("ss", companies.get(position).getSs());
intent.putExtra("strs", companies.get(position).getSTrs());
intent.putExtra("inout", holder.liquidity_type.getText().toString());
intent.putExtra("sb", companies.get(position).getSb());
intent.putExtra("ts", companies.get(position).getTs());
intent.putExtra("net_liquidity", companies.get(position).getSyola_Net());
intent.putExtra("stock_code", companies.get(position).getStockCode());
intent.putExtra("thero", companies.get(position).getTermo());
intent.putExtra("pos", position);
BroadcastHelper.sendInform(context, "open_company", intent);
BroadcastHelper.sendInform(context, "closedialog");
}
});
} else {
holder.liquidity_type.setText(companies.get(position).getLiquidity_status());
if (companies.get(position).getLiquidity_status().equals("0.00")){
holder.liquidity_type.setTextColor(context.getResources().getColor(R.color.green));
}else {
if (companies.get(position).getLiquidity_status().equals("in")) {
holder.liquidity_type.setTextColor(context.getResources().getColor(R.color.green));
} else {
holder.liquidity_type.setTextColor(context.getResources().getColor(R.color.red));
}
}
holder.DailyHighPrice.setText(precision.format(Double.parseDouble(companies.get(position).getDailyHighPrice())));
holder.DailyLowPrice.setText(precision.format(Double.parseDouble(companies.get(position).getDailyLowPrice())));
holder.DailyLowPrice.setTextColor(context.getResources().getColor(R.color.red));
holder.DailyHighPrice.setTextColor(context.getResources().getColor(R.color.green));
holder.company_id.setText(companies.get(position).getStockCode());
companies.get(position).setFirstTime(true);
if (companies.get(position).getLastTradePrice() != null) {
holder.LastTradePrice.setText(precision.format(Double.parseDouble(companies.get(position).getLastTradePrice())));
}
if (companies.get(position).getDiffLastPricePercent() != null) {
holder.DiffLastPricePercent.setText
(precision.format(Double.valueOf(companies.get(position)
.getDiffLastPricePercent())));
if (!companies.get(position).getDiffLastPricePercent().contains("-")) {
holder.DiffLastPricePercent.setTextColor(context.getResources().getColor(R.color.green));
holder.LastTradePrice.setTextColor(context.getResources().getColor(R.color.green));
} else {
holder.DiffLastPricePercent.setTextColor(context.getResources().getColor(R.color.red));
holder.LastTradePrice.setTextColor(context.getResources().getColor(R.color.orange));
}
}
if (companies.get(position).getAskPrice() != null)
holder.BidPrice.setText(companies.get(position).getAskPrice());
if (companies.get(position).getAskVol() != null && !companies.get(position).getAskVol().equals(""))
holder.BidVol.setText(NumberFormat.getNumberInstance(Locale.US).format(Double.valueOf(
companies.get(position).getAskVol())));
if (companies.get(position).getBidPrice() != null)
holder.AskPrice.setText(precision.format(Double.parseDouble(companies.get(position).getBidPrice())));
if (companies.get(position).getBidVol() != null && !companies.get(position).getBidVol().equals(""))
holder.AskVol.setText(NumberFormat.getNumberInstance(Locale.US).format(Double.valueOf(
companies.get(position).getBidVol())));
double thero = companies.get(position).getTermo();
holder.liquidity.setText(precision.format(thero));
if (thero >= 0.4 && thero < 0.8) {
holder.liquidity.setBackgroundResource(R.color.beige);
holder.liquidity.setTextColor(context.getResources().getColor(R.color.green_dark));
}
if (thero >= 0.8 && thero < 1.8) {
holder.liquidity.setBackgroundResource(R.color.yellow);
holder.liquidity.setTextColor(Color.BLUE);
}
if (thero >= 1.8 && thero < 2.8) {
holder.liquidity.setBackgroundColor(Color.BLUE);
holder.liquidity.setTextColor(Color.WHITE);
}
if (thero >= 2.8) {
holder.liquidity.setBackgroundResource(R.color.black);
holder.liquidity.setTextColor(context.getResources().getColor(R.color.gold));
}
if (thero < 0.4 && thero >= 0) {
holder.liquidity.setTextColor(Color.GREEN);
holder.liquidity.setBackgroundResource(R.color.black);
}
if (thero < 0) {
holder.liquidity.setTextColor(Color.RED);
holder.liquidity.setBackgroundResource(R.color.black);
}
if (companies.get(position).getNameA() != null)
holder.NameA.setText(companies.get(position).getNameA());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("aaaa");
intent.putExtra("name", companies.get(position).getNameA());
intent.putExtra("cprice", companies.get(position).getLastTradePrice());
intent.putExtra("cpercentage", companies.get(position).getDiffLastPricePercent());
intent.putExtra("openning_price", companies.get(position).getOpenning_price());
intent.putExtra("lower_price", companies.get(position).getDailyLowPrice());
intent.putExtra("deals", companies.get(position).getDeals_count());
intent.putExtra("value", companies.get(position).getValue());
intent.putExtra("higher", companies.get(position).getDailyHighPrice());
intent.putExtra("lastclose", companies.get(position).getLast_close());
intent.putExtra("size", companies.get(position).getSize());
intent.putExtra("point", companies.get(position).getCreation());
intent.putExtra("ss", companies.get(position).getSs());
intent.putExtra("strs", companies.get(position).getSTrs());
intent.putExtra("inout", holder.liquidity_type.getText().toString());
intent.putExtra("sb", companies.get(position).getSb());
intent.putExtra("ts", companies.get(position).getTs());
intent.putExtra("net_liquidity", companies.get(position).getSyola_Net());
intent.putExtra("stock_code", companies.get(position).getStockCode());
intent.putExtra("thero", companies.get(position).getTermo());
intent.putExtra("pos", position);
BroadcastHelper.sendInform(context, "open_company", intent);
BroadcastHelper.sendInform(context, "closedialog");
}
});
}
} else {
holder.liquidity_type.setText(companies.get(position).getLiquidity_status());
holder.DailyHighPrice.setText(precision.format(Double.parseDouble(companies.get(position).getDailyHighPrice())));
holder.DailyLowPrice.setText(precision.format(Double.parseDouble(companies.get(position).getDailyLowPrice())));
holder.DailyLowPrice.setTextColor(context.getResources().getColor(R.color.red));
holder.DailyHighPrice.setTextColor(context.getResources().getColor(R.color.green));
holder.company_id.setText(companies.get(position).getStockCode());
if (companies.get(position).getLastTradePrice() != null)
holder.LastTradePrice.setText(precision.format(Double.parseDouble(companies.get(position).getLastTradePrice())));
if (companies.get(position).getDiffLastPricePercent() != null) {
holder.DiffLastPricePercent.setText
(precision.format(Double.valueOf(companies.get(position)
.getDiffLastPricePercent())));
if (!companies.get(position).getDiffLastPricePercent().contains("-")) {
holder.DiffLastPricePercent.setTextColor(context.getResources().getColor(R.color.green));
holder.LastTradePrice.setTextColor(context.getResources().getColor(R.color.green));
} else {
holder.DiffLastPricePercent.setTextColor(context.getResources().getColor(R.color.red));
holder.LastTradePrice.setTextColor(context.getResources().getColor(R.color.orange));
}
}
if (companies.get(position).getAskPrice() != null)
holder.BidPrice.setText(precision.format(Double.parseDouble(companies.get(position).getAskPrice())));
if (companies.get(position).getAskVol() != null && !companies.get(position).getAskVol().equals(""))
holder.BidVol.setText(NumberFormat.getNumberInstance(Locale.US).format(Double.valueOf(
companies.get(position).getAskVol())));
if (companies.get(position).getBidPrice() != null)
holder.AskPrice.setText(precision.format(Double.parseDouble(companies.get(position).getBidPrice())));
if (companies.get(position).getBidVol() != null && !companies.get(position).getBidVol().equals(""))
holder.AskVol.setText(NumberFormat.getNumberInstance(Locale.US).format(Double.valueOf(
companies.get(position).getBidVol())));
double thero = companies.get(position).getTermo();
holder.liquidity.setText(precision.format(companies.get(position).getTermo()));
if (thero >= 0.4 && thero < 0.8) {
holder.liquidity.setBackgroundResource(R.color.beige);
holder.liquidity.setTextColor(context.getResources().getColor(R.color.green_dark));
}
if (thero >= 0.8 && thero < 1.8) {
holder.liquidity.setBackgroundResource(R.color.yellow);
holder.liquidity.setTextColor(Color.BLUE);
}
if (thero >= 1.8 && thero < 2.8) {
holder.liquidity.setBackgroundColor(Color.BLUE);
holder.liquidity.setTextColor(Color.WHITE);
}
if (thero >= 2.8) {
holder.liquidity.setBackgroundResource(R.color.black);
holder.liquidity.setTextColor(context.getResources().getColor(R.color.gold));
}
if (thero < 0.4 && thero >= 0) {
holder.liquidity.setTextColor(Color.GREEN);
holder.liquidity.setBackgroundResource(R.color.black);
}
if (thero < 0) {
holder.liquidity.setTextColor(Color.RED);
holder.liquidity.setBackgroundResource(R.color.black);
}
holder.liquidity_type.setText(companies.get(position).getLiquidity_status());
if(companies.get(position).getLiquidity_status().equals("in")){
holder.liquidity_type.setTextColor(context.getResources().getColor(R.color.green));
}else {
holder.liquidity_type.setTextColor(context.getResources().getColor(R.color.red));
}
if (companies.get(position).getNameA() != null)
holder.NameA.setText(companies.get(position).getNameA());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("aaaa");
intent.putExtra("name", companies.get(position).getNameA());
intent.putExtra("cprice", companies.get(position).getLastTradePrice());
intent.putExtra("cpercentage", companies.get(position).getDiffLastPricePercent());
intent.putExtra("openning_price", companies.get(position).getOpenning_price());
intent.putExtra("lower_price", companies.get(position).getDailyLowPrice());
intent.putExtra("deals", companies.get(position).getDeals_count());
intent.putExtra("value", companies.get(position).getValue());
intent.putExtra("higher", companies.get(position).getDailyHighPrice());
intent.putExtra("lastclose", companies.get(position).getLast_close());
intent.putExtra("size", companies.get(position).getSize());
intent.putExtra("point",companies.get(position).getCreation());
intent.putExtra("ss",companies.get(position).getSs());
intent.putExtra("strs",companies.get(position).getSTrs());
intent.putExtra("inout",holder.liquidity_type.getText().toString());
intent.putExtra("sb",companies.get(position).getSb());
intent.putExtra("ts",companies.get(position).getTs());
intent.putExtra("thero",companies.get(position).getTermo());
intent.putExtra("net_liquidity",companies.get(position).getSyola_Net());
intent.putExtra("stock_code",companies.get(position).getStockCode());
intent.putExtra("pos",position);
BroadcastHelper.sendInform(context, "open_company", intent);
BroadcastHelper.sendInform(context, "closedialog");
}
});
}
}
@Override
public int getItemViewType(int position) {
return position;
}
}
推荐答案
经过多次搜索并尝试了许多解决方案 终于我找到了解决方案 我将ReyclerView更改为listView并通过此代码更新了我的列表
after many searches and try many solutions finally i find the solution i changed ReyclerView To listView and updating my list by this code
if (itemPos >= company_recycler.getFirstVisiblePosition() && itemPos-1<company_recycler.getLastVisiblePosition()){
final View cell = company_recycler.getChildAt(itemPos - company_recycler.getFirstVisiblePosition() );
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.getView(itemPos-1, cell, company_recycler);
}
});
这对我来说很好
这篇关于Android RecyclerView Adapter notifyItemChanged()已在池中获取IllegalStateException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!