android - 我的RecyclerView没有在通知方法上更新

标签 android multithreading android-recyclerview

在将其标记为重复项之前,请先阅读! :)

我在应用程序中将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);
            }
        }
    });
}

}

这是 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中。我验证了,但是notify notifyItemInserted似乎不起作用。我试着在UI线程上运行它,但是那似乎也没有用。

有什么建议?我遵循了android recyclerview示例。也许我没有正确使用RunOnUiThread?

另外,如果您发现由于名称更改而引起的任何语法错误(不是问题),则在Android Studio上,代码是无错误的。

最佳答案

我会拍照,说这是因为有这个自定义的动画适配器:
legList.setAdapter(new AlphaInAnimationAdapter(adapter));
尝试这种方式:

adapter = new AlphaInAnimationAdapter(new CustomViewAdapter(LegActivity.this, legsList));
legList.setAdapter(adapter);

关于android - 我的RecyclerView没有在通知方法上更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595909/

相关文章:

android - 用对象项填充 listView 的正确方法?

android - 多人游戏编程

android - 是否可以根据列表中的数据在 Android ListView 项目上设置项目/ View 样式?

python - multiprocessing.Queue 的工作示例

java - 我的线程在运行几个小时后停止

C++单例实现STL线程安全

android - RecyclerView中adapter什么时候为null

android - Android 中的自定义字体泄漏内存

android - 解析嵌套的 JSON 值并在按日期排序时显示在 recyclerview 中

java - Android:如何让 Cardviews 在 Recyclerview 中重叠?