首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在更改数据后刷新recyclerView?

如何在更改数据后刷新recyclerView?
EN

Stack Overflow用户
提问于 2018-09-30 06:48:33
回答 1查看 1.5K关注 0票数 0

我对RecyclerView有个问题。我需要在点击一个长点击后刷新它。我尝试使用notifyDataSetChanged()方法。但是什么都不起作用。这是我的代码。在当前情况下,项将立即从数据库中删除。但我必须移动到另一个活动,然后再回来查看任何UI更改。提前感谢您的帮助。

代码语言:javascript
复制
public class AlarmsActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private List<Alarm> alarmsList = new ArrayList<>();
    private AlarmRecyclerAdapter mAdapter;
    private AppDataBase db;
    private AlarmsDao alarmDao;
    private OnClickedRecyclerAdapter<Alarm> recyclerListener;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.alarms_activity);
        db = App.getInstance().getDataBase();
        alarmDao = db.AlarmDao();
        recyclerView = findViewById(R.id.recycler);
        recyclerListener = new OnClickedRecyclerAdapter<Alarm>() {
            @Override
            public void onLongClicked(final Alarm data) {
                removeAlarm(data);
            }

            @Override
            public void onClicked(Alarm data) {

            }
        };
        mAdapter = new AlarmRecyclerAdapter(alarmsList, recyclerListener);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();
        getData();

    }

    public void getData(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (Alarm alarm : alarmDao.getAll()){
                    alarmsList.add(alarm);
                }
            }
        }).start();
    }

    public void removeAlarm(final Alarm alarm){
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.e("xxx", "Long clicked");
                alarmDao.deleteAlarm(alarm);

            }
        }).start();
    }

}

OnClickListener

代码语言:javascript
复制
public interface OnClickedRecyclerAdapter<Alarm> {
    void onLongClicked(Alarm data);
    void onClicked(Alarm data);
}

适配器。

代码语言:javascript
复制
public class AlarmRecyclerAdapter extends RecyclerView.Adapter<AlarmViewHolder> {

    List<Alarm> alarms;
    OnClickedRecyclerAdapter listener;
    private AppDataBase db;
    private AlarmsDao alarmsDao;

    public AlarmRecyclerAdapter(List<Alarm> alarms, OnClickedRecyclerAdapter listener) {
        this.alarms = alarms;
        this.listener = listener;
        db = App.getInstance().getDataBase();
        alarmsDao = db.AlarmDao();
    }

    @NonNull
    @Override
    public AlarmViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler, parent, false);
        return new AlarmViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull AlarmViewHolder holder, final int position) {
        final Alarm alarm = alarms.get(position);
        holder.time.setText(alarm.getHour()+" : " + alarm.getMinute());
        holder.days.setText(alarm.getDays());
        holder.isOn.setChecked(alarm.isIs_on());
        holder.isOn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                Log.e("xxx", b + " ");
            }
        });
        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                listener.onClicked(alarm);
            }
        });
        holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {

                listener.onLongClicked(alarm);
                return true;
            }
        });
    }

    @Override
    public int getItemCount() {
        return alarms.size();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-30 07:25:06

更改此设置:

代码语言:javascript
复制
holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        listener.onLongClicked(alarm);
        return true;
    }
});

要这样做:

代码语言:javascript
复制
holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        listener.onLongClicked(alarm);
        alarms.remove(holder.getAdapterPosition()); //or alarms.remove(alarm);
        notifyItemRemoved(holder.getAdapterPosition()); //or notifyDataSetChanged();
        return true;
    }
});

问题是,当您在Activity中调用removeAlarm()时,您正在从数据库中删除警报,但您实际上并没有将其从适配器的alarms列表中删除。更改不会反映在代码中,因为数据集永远不会更改。当您重新创建您的活动时,您将新的数据库列表传递到Adapter中,这样它就会更新。

我还建议不要这样做:

代码语言:javascript
复制
public void getData(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (Alarm alarm : alarmDao.getAll()){
                alarmsList.add(alarm);
            }
        }
    }).start();
}

虽然Activity和alarms中的alarmsList是同一个实例,因此反映了相同的添加和删除,但不能保证此逻辑将在RecyclerView膨胀并附加适配器之前完成。这意味着你最终可能会丢失数据,特别是在速度较慢的设备上。

除非你有大量的警报,否则没有必要在新的线程中运行它。您只需将该for循环移到初始化适配器的位置上方,并使用addAll()方法:

代码语言:javascript
复制
alarmsList.addAll(alarmDuo.getAll());
mAdapter = //your assignment from your code

如果您确实需要它是异步的,请稍后在您的线程中附加适配器:

代码语言:javascript
复制
public void getData(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            alarmsList.addAll(alarmDuo.getAll());
            runOnUiThread(new Runnable() {
                mAdapter = new AlarmRecyclerAdapter(alarmsList, recyclerListener);
                recyclerView.setAdapter(mAdapter);
            }
        }
    }).start();
}

onCreate()方法中删除赋值、适配器设置和notifyDataSetChanged()调用:

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.alarms_activity);
    db = App.getInstance().getDataBase();
    alarmDao = db.AlarmDao();
    recyclerView = findViewById(R.id.recycler);
    recyclerListener = new OnClickedRecyclerAdapter<Alarm>() {
        @Override
        public void onLongClicked(final Alarm data) {
            removeAlarm(data);
        }

        @Override
        public void onClicked(Alarm data) {

        }
    };
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    getData();

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52573170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档