首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在recyclerview中插入数据库数据后立即显示和更新数据库中的数据?

如何在recyclerview中插入数据库数据后立即显示和更新数据库中的数据?
EN

Stack Overflow用户
提问于 2018-02-27 18:40:07
回答 1查看 63关注 0票数 0

我有一个录音机app.It把声音录成片段。我想在回收器视图中以另一个片段显示录制的项目。现在发生的情况是录音机工作正常。我已经看到数据被插入到数据库中。但录制的项目不会显示在回收器视图中。我想在数据插入时立即在recyclerview上显示记录的项目。

这是我的适配器类

代码语言:javascript
复制
    public class FileViewerAdapter extends RecyclerView.Adapter<FileViewerAdapter.RecordingViewHolder> implements OnDatabaseChangedListener
    {
        Context mContext;
        DBHelper mDatabase;
        RecordingItem item;
        LinearLayoutManager llm;
        private static final String LOG_TAG = "FileViewerAdapter";

        @Override
        public FileViewerAdapter.RecordingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view,parent,false);
            mContext=parent.getContext();
            return new RecordingViewHolder(v);
        }

        public FileViewerAdapter(Context context, LinearLayoutManager linearLayoutManager) {
            super();
            mContext = context;
            mDatabase = new DBHelper(mContext);
            mDatabase.setOnDatabaseChangedListener(this);
            llm = linearLayoutManager;
        }

        @Override
        public void onBindViewHolder(final FileViewerAdapter.RecordingViewHolder holder, final int position) {
            item=getItem(position);
            int itemDuration=item.getLength();

            int minute= (int) TimeUnit.MILLISECONDS.toMinutes(itemDuration);
            int second= (int) ( TimeUnit.MILLISECONDS.toSeconds(itemDuration)-TimeUnit.MINUTES.toSeconds(minute));

            holder.vName.setText(item.getName());
            holder.vLength.setText(String.format("%02d:%02d", minute, second));
            holder.vDateAdded.setText(
                    DateUtils.formatDateTime(
                            mContext,
                            item.getTime(),
                            DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_YEAR));

            holder.cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        PlaybackFragment playbackFragment =
                                new PlaybackFragment().newInstance(getItem(holder.getPosition()));

                        FragmentManager fm = ((FragmentActivity) mContext)
                                .getSupportFragmentManager();

                        FragmentTransaction ft=fm.beginTransaction();
                        playbackFragment.show(fm,"dialog playback");
                        ft.commit();

                    }catch(Exception e)
                    {
                        Log.e(LOG_TAG,"exception",e);
                    }
                }
            });

            holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {

                    ArrayList<String> arrayList=new ArrayList<String>() ;
                    arrayList.add(mContext.getString(R.string.dialog_file_share));
                    arrayList.add(mContext.getString(R.string.dialog_file_rename));
                    arrayList.add(mContext.getString(R.string.dialog_file_delete));

                    final CharSequence[] items= arrayList.toArray(new CharSequence[arrayList.size()]);

                    AlertDialog.Builder builder=new AlertDialog.Builder(mContext);
                    builder.setTitle(mContext.getString(R.string.dialog_title_options));
                    builder.setItems(items, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int position) {
                            if(position==0)
                            {
                                shareFileDialog(holder.getPosition());
                            }

                            if(position==1)
                            {
                                renameFileDialog(holder.getPosition());
                            }

                            if(position==2)
                            {
                                deleteFileDialog(holder.getPosition());
                            }
                        }
                    });

                    builder.setCancelable(true);
                    builder.setNegativeButton(mContext.getString(R.string.dialog_action_cancel), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
                    AlertDialog alert= builder.create();
                    alert.show();
                    return false;
                }

            });
        }

        @Override
        public int getItemCount() {
            return mDatabase.getCount();
        }
}

以下是片段类的'OnCreateView‘方法,其中将显示回收视图

代码语言:javascript
复制
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_file_viewer, container, false);

    RecyclerView mRecyclerView = (RecyclerView) v.findViewById(R.id.recycleView);
    mRecyclerView.setHasFixedSize(true);
    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    llm.setOrientation(LinearLayoutManager.VERTICAL);

    //newest to oldest order (database stores from oldest to newest)
    llm.setReverseLayout(true);
    llm.setStackFromEnd(true);

    mRecyclerView.setLayoutManager(llm);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    mFileViewerAdapter = new FileViewerAdapter(getActivity(), llm);
    mRecyclerView.setAdapter(mFileViewerAdapter);
    mFileViewerAdapter.notifyDataSetChanged();
    return v;
}

那么,问题出在哪里呢?请来人帮帮忙!

EN

回答 1

Stack Overflow用户

发布于 2018-02-27 21:05:35

通过查看您的,我已经了解到,您没有正确地实现recyclerview适配器。

从DB中选择数据并将其存储在数组列表中,并将其传递给适配器,然后访问其中的数据并将其设置为VIews。

在将数据插入到数据库(我希望是SQLite)之后,您必须再次获取数据并将其添加到数组列表中,然后通过从活动/片段调用adapter.notifyDataSetChanged();来更新回收视图。

通过这种方式,您可以实现干净且可维护的代码。

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

https://stackoverflow.com/questions/49006665

复制
相关文章

相似问题

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