[英]My RecyclerView doesnt update on Notify Methods
在將其標記為重復項之前,請先閱讀! :)
我在應用程序中將listview轉換為recyclerview。 但是問題是,當我調用任何notify方法時,它只是不會更新。 我讀到我應該在Ui Thread上調用這些方法。 但即使那樣也不起作用。 數據列表中添加了該項目,但未在UI上顯示。
這是代碼。
適配器:
public class CustomViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Activity activity;
ArrayList<Leg> data;
public CustomViewAdapter(Activity a, ArrayList<Leg> d) {
super();
activity = a;
data = d;
}
@Override
public int getItemCount() {
return data.size();
}
@Override
public int getItemViewType(int position) {
Leg tempValues = data.get(position);
return tempValues.getLegType();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 1:
//...type 1
case 2:
//...type 2
default:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_leg, parent, false);
return new LegViewHolder1(v);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Leg tempValues = data.get(position);
//.... Simple view logic that correctly displays
}
class LegViewHolder2 extends RecyclerView.ViewHolder {
//... Holder of another type
}
class LegViewHolder1 extends RecyclerView.ViewHolder {
@InjectView(R.id.leg_add_button)
RelativeLayout legAddIcon;
public AddLegViewHolder(View v) {
super(v);
ButterKnife.inject(this, v);
legAddIcon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Add Debug", "AddIcon clicked");
Leg leg = new Leg();
leg.setLegType(Constants.LEG);
data.add((data.size() - 1), leg);
refreshList("add", (data.size() - 1)); /// was using notify previously here
}
});
}
}
public void refreshList(final String type, final int position) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (type.equals("update")) {
notifyItemChanged(position);
} else if (type.equals("remove")) {
notifyItemRemoved(position);
} else if (type.equals("add")) {
notifyItemInserted(position);
}
}
});
}
}
這是活動:
public class LegActivity extends BaseActivity {
CustomViewAdapter adapter;
LoadTask loadTask = null;
ArrayList<Leg> legsList;
@InjectView(R.id.leg_list)
RecyclerView legList;
@Override
public void onCreate(Bundle savedInstanceState) {
//...boiler plate code
legList.setHasFixedSize(true);
legList.setLayoutManager(new LinearLayoutManager(this));
loadTask = new LoadTask(this);
loadTask.execute();
}
class LoadTask extends RoboAsyncTask<Boolean> {
protected LoadTask(Context context) {
super(context);
}
@Override
protected void onPreExecute() {
// show loader
}
@Override
public Boolean call() throws Exception {
//load some data the send boolean for success
}
@Override
protected void onSuccess(Boolean success) {
//checking for success and loading data to legslist.
adapter = new CustomViewAdapter(LegActivity.this, legsList);
legList.setAdapter(new AlphaInAnimationAdapter(adapter));
legList.setItemAnimator(new SlideInLeftAnimator());
}
@Override
protected void onException(Exception e) {
// other code....
}
}
}
問題是當我單擊添加按鈕時,該對象已添加到實際的legList中。 我驗證了,但是notify notifyItemInserted似乎不起作用。 我試着在UI線程上運行它,但即使這樣似乎也沒有用。
有什么建議么? 我遵循了android recyclerview示例。 也許我沒有正確使用RunOnUiThread?
另外,如果您發現由於名稱更改而引起的任何語法錯誤(不是問題),則在Android Studio上,代碼是無錯誤的。
我會拍照,說這是因為有了這個自定義動畫適配器:
legList.setAdapter(new AlphaInAnimationAdapter(adapter));
嘗試這種方式:
adapter = new AlphaInAnimationAdapter(new CustomViewAdapter(LegActivity.this, legsList));
legList.setAdapter(adapter);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.