当前位置: 首页 > 知识库问答 >
问题:

RecyclerView:如何刷新详细活动?

宇文元明
2023-03-14

在MainActivity中,我有一个CardView项目的RecyclerView列表。

单击任何CardView都会启动DetailsActivity CardView,它显示数据库中该特定CardView的更多数据。

单击DetailsActivity CardView会启动EditActivity来编辑该CardView的数据。单击“保存”按钮将用户返回到DetailsActivity,这样用户就可以看到对该CardView所做的任何编辑更改。CardView项目的模型实现了Parcelable,所以我使用getParcelable()来传递项目及其活动意图中的数据库数据。

我的问题是,在单击“保存”后,用户返回到DetailsActivity CardView,并显示CardView的旧视图(用户刚刚输入并保存到数据库的更新数据之前的视图)。我尝试使用“adapter.notifyDataSetChanged()”来更新视图,但是没有成功。

不知何故,我需要从EditActivity重新加载MainActivity,以便RecyclerView更新适配器,然后将用户返回到更新的DetailsActivity CardView。我可以使用startActivityForResult()吗?我错过了什么?

这是用户界面的进展:

主活动回收视图和适配器:

--Adapter使用回收器ItemClickListener将单击的CardView项目发送回Mainactive,以便我可以使用onItemClick()启动DetailsActive。

--onItemClick()通过一个Intent启动DetailsActivity

细节活动:

-使用onClickListener和启动EditActivity的意图

编辑活动:

-我希望单击“保存”按钮,将新的/更新的CardView数据保存到数据库,并让用户返回到详细活动,以便用户可以看到对CardView的更改。

Adapter
...
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item, parent, false);
    final ItemHolder itemHolder = new ItemHolder(view);

        // Attach a Click listener to the items's (row) view.
        // itemView is from the ItemHolder().
        // onItemClick is the click method in MainActivity.
        itemHolder.itemView.setOnClickListener(new View.OnClickListener() {
            // Handles the row being clicked.
            @Override
            public void onClick(View view) {

                ListItem adapterItem = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition()); 
                if (recyclerItemClickListener != null) {
                    // pass the item to the Main Activity
                    // through the RecyclerItemClickListener file and its
                    // public interface.
                    recyclerItemClickListener.onItemClick(itemHolder.itemView, adapterItem);
                }
            }
        });            
    return itemHolder;
}

MainActivity (the RecyclerView Activity)
...
@Override
public void onItemClick(View view, ListItem listItem) {

    Intent intent = new Intent(this, DetailsActivity.class);        
    intent.putExtra("item",listItem);
    startActivity(intent);
}

DetailsActivity
...
public class DetailsActivity extends AppCompatActivity {

    onCreate(...) {

        Bundle extras = getIntent().getExtras();
        if (extras != null) {            
            listItem = extras.getParcelable("item"); 
    }

    helper = new SQLiteDB(this);
    listItems = new ArrayList<>();
    listItems = helper.getAllDBItems();

    cvdcardType1 = (TextView) findViewById(R.id.cvdcardType1);
    if (listItems !=null && listItems.size() !=0) {
        cvdcardType1.setText(listItem.getType());
    }

    cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent i = new Intent(DetailsActivity.this,EditActivity.class);
            i.putExtra("cvdItem",listItem);                
            startActivityForResult(i,REQUEST_CODE);

        }
    });
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == REQUEST_CODE) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            listItem = null;
            Bundle returnExtras = getIntent().getExtras();
            if (returnExtras != null) {
                listItem = returnExtras.getParcelable("returnItem");
                if (listItems !=null && listItems.size() !=0) {

                    cvdcardType1.setText(listItem.getType()); 
                    ...  
}
            }
        }
        else if (resultCode == Activity.RESULT_CANCELED) {
            // Finish the startActivityForResult().
            finish();
        }
    }
}

}

EditActivity

public class EditActivity extends AppCompatActivity {
onCreate(...) {
Bundle extras = getIntent().getExtras();
    if (extras != null) {            
        item = extras.getParcelable("cvdItem");
    }
}

// "Save Button"
public void onClickSaveEdits(View v) {
    // update database
    // update RecyclerView adapter and CardView Items
    // update DetailsActivity CardView
    // return the user to DetailsActivity to see updated CardView
    Intent returnIntent = new Intent(EditActivity.this, DetailsActivity.class);
    returnIntent.putExtra("returnItem", item);
    setResult(Activity.RESULT_OK,returnIntent);
    finish();
}

共有2个答案

屠泰平
2023-03-14

简单地说,您可以在编辑详细信息后再次在MainActivity的< code>onResume()中读取数据库项目。

allList = sqLiteDB.getAllDBItems();
adapter.notifyDatasetChanged();

简单地说,从数据库中再次读取列表并重新绘制。并确保您在EditActivity中保存了数据库中的更改

并使用start ActivityForResult()调用您的EditActive,无论您更改什么,都将其传回setResult();

在 onActivityResult 方法中,DetailActivity 用新值填充数据。

洪梓
2023-03-14

您必须在转向EditActivity的同时完成DetailActivity,然后在onBackPressed()方法中再次启动DetureActivity,如下所示:

Intent intent = new Intent(EditActivity.this, DetailsActivity.class);        
intent.putExtra("item",item);
startActivity(intent);
 类似资料:
  • 我用碎片制作了一个mediaplayer应用程序;歌曲、专辑、艺术家、流派、播放列表 这是我的一个片段中的代码,我将以艺术家为例 在我的initRecyClaire View()方法中,我有一个名为“项目”的数组列表,其中包含歌曲艺术家。Main.songs.get艺术家- 现在,当用户点击一个艺术家时,另一个活动将启动ListSong sActivity.java 这是类中的代码ListSong

  • 我有一个IntentService 9:00开始,每小时重复一次。 它与创建捆绑包的AsyncTask一起工作。 IntentService必须在对话框中显示一个活动(就像Viber用于消息一样),它显示此BUNDLE中的一部分数据,并且它必须创建一个显示相同部分数据的通知。如果用户单击通知,它将启动第二个活动,显示BUNDLE中的所有数据。 问题是:IntentService完成他的工作,显示活

  • 但当我刷完后,该物品很快就会从列表中移除!我如何锁定刷过的项目,并通过单击“删除”按钮删除?就像Gmail的行为一样。 ps.I在此发布相同的问题https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=id%20type%20status%20owner%20summary%20stars&g

  • 本文向大家介绍RecyclerView下拉刷新上拉加载,包括了RecyclerView下拉刷新上拉加载的使用技巧和注意事项,需要的朋友参考一下 一 、前言 最近实在太忙,一个多礼拜没有更新文章了,于是今晚加班加点把demo写出来,现在都12点了才开始写文章。 1.我们的目标 把RecyclerView下拉刷新上拉加载更多加入到我们的开发者头条APP中。 2.效果图 3.实现步骤 找一个带上拉刷新下

  • 删除项目后,“我的回收器”视图未更新。此recyclerView位于片段内部。我试过各种方法,但都不管用。 片段类中的适配器声明 回收服务适配器: } 调试项目时,我可以看到该项实际上正在从ArrayList中删除。但不在循环视图中更新。 删除后,如果滚动回收站视图,则从回收站视图中删除已删除的项。但不是没有滚动。