我的 RecyclerView 不更新通知方法
My RecyclerView doesnt update on Notify Methods
请在将其标记为重复之前阅读! :)
我在我的应用程序中将列表视图转换为回收视图。但问题是当我调用任何通知方法时它只是不更新。我读到我应该在 Ui 线程上调用这些方法。但即使那样也行不通。数据列表已添加项目,但未显示在 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);
}
}
});
}
}
这是Activity:
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 中。我验证了这一点,但通知 notifyItemInserted 似乎不起作用。我在 UI 线程上尝试了 运行,但即使那样似乎也不起作用。
有什么建议吗?我遵循了 android recyclerview 示例。也许我错误地使用了 RunOnUiThread?
此外,如果您发现由于名称更改而导致的任何语法错误,那不是问题,在 Android Studio 上代码没有错误。
我会拍一张照片说这是因为这个自定义动画适配器:
legList.setAdapter(new AlphaInAnimationAdapter(adapter));
这样试试:
adapter = new AlphaInAnimationAdapter(new CustomViewAdapter(LegActivity.this, legsList));
legList.setAdapter(adapter);
请在将其标记为重复之前阅读! :)
我在我的应用程序中将列表视图转换为回收视图。但问题是当我调用任何通知方法时它只是不更新。我读到我应该在 Ui 线程上调用这些方法。但即使那样也行不通。数据列表已添加项目,但未显示在 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);
}
}
});
}
}
这是Activity:
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 中。我验证了这一点,但通知 notifyItemInserted 似乎不起作用。我在 UI 线程上尝试了 运行,但即使那样似乎也不起作用。
有什么建议吗?我遵循了 android recyclerview 示例。也许我错误地使用了 RunOnUiThread?
此外,如果您发现由于名称更改而导致的任何语法错误,那不是问题,在 Android Studio 上代码没有错误。
我会拍一张照片说这是因为这个自定义动画适配器:
legList.setAdapter(new AlphaInAnimationAdapter(adapter));
这样试试:
adapter = new AlphaInAnimationAdapter(new CustomViewAdapter(LegActivity.this, legsList));
legList.setAdapter(adapter);