如何将活动中的数据传递回RecyclerView适配器。我点击了回收站视图中的一行并开始了一项新活动。从新活动中我如何将对象传递回适配器并更新我开始活动的行
public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> {
private List<Movie> moviesList;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title, year, genre;
LinearLayout layout;
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.title);
genre = (TextView) view.findViewById(R.id.genre);
year = (TextView) view.findViewById(R.id.year);
layout = (LinearLayout) view.findViewById(R.id.layout);
}
}
public MoviesAdapter(List<Movie> moviesList) {
this.moviesList = moviesList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.movie_list_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Movie movie = moviesList.get(position);
holder.title.setText(movie.getTitle());
holder.genre.setText(movie.getGenre());
holder.year.setText(movie.getYear());
holder.layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mContext.startActivity(new Intent(mContext, MovieDetailsActivity.class));
}
});
}
@Override
public int getItemCount() {
return moviesList.size();
}
}
在我创建的新活动中,我将编辑电影详细信息,点击确定后,我需要将Movie对象传回适配器并更新相应的行。
答案 0 :(得分:0)
是的,首先你需要实现一个方法来在你的适配器中添加一个元素,让我们说void addItem(Movie movie);
然后,您需要从之前的活动中恢复数据。
你有多种解决方案。最明显的一个,鉴于您向我们展示的代码将是Movie
班Parcelable
。当您的电影延长至Parcelable
时,我只会给您this链接,因为我不是向您解释Parcelables的最佳人选:/)您可以将它捆绑到您的{ {1}}。
所以,你在第一个活动中有你的适配器(我们称之为activity
),你想要从你的第二个活动中添加MainActivity
(我们称之为Movie
)
您需要做的是打开SecondActivity
“获得结果”,这意味着您期望此活动产生结果。
一旦进入SecondActivity
,您需要做一些新的SecondActivity
添加新的Movie
并将其添加到您的MainActivity
并将其放入您的结果中。
您的最终代码将如下所示
MainActivity
public static String MOVIE_REQUEST = "movie_request";
@Override
protected void onCreate(Bundle savedInstance){
...
previous logic
...
recyclerView.setAdapter(mAdapter);
...
rest of the logic of your activity
...
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MOVIE_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
Movie movie = (Movie)data.getParcelableExtra(SecondActivity.MOVIE_EXTRA);
mAdapter.addItem(movie);
}
}
}
适配器
public void addItem(Movie movie){
movieList.add(movie);
//Your code should be way better than this anwser btw) notifyDatasetChanged isn't the best way to proceed
notifyDatasetChanged();
}
SecondActivity
public static final String MOVIE_EXTRA = "movie_extra";
private void sendMovie(Movie movie){
Intent data = new Intent();
data.putExtra(MOVIE_EXTRA, movie);
//At this point you're returning your result to your first activity
setResult(RESULT_OK, data);
}
你已经完成了,你应该从第二个活动中获得一部新电影
此致 马修
答案 1 :(得分:0)
在您的模型名称boolean
中创建isSelected
,点击该对象后true
,onBindView
方法RecyclerView
制作一个isSelected
检查对象@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Movie movie = moviesList.get(position);
holder.title.setText(movie.getTitle());
holder.genre.setText(movie.getGenre());
holder.year.setText(movie.getYear());
if(movie.isSelected()){
holder.layout.setBackgroundColor(Color.GRAY);
}
holder.layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
movie.setSelected(true);
notifyDatasetChanged();
mContext.startActivity(new Intent(mContext, MovieDetailsActivity.class));
}
});
}
是否为真,然后根据需要执行选定的操作。
com.fasterxml.jackson.core.JsonToken
答案 2 :(得分:0)
在清单中声明适配器活动singleTask,然后在单击item时从适配器打开新活动,在第二个活动中传递item的int位置,然后在第二个activity中使用intent调用第一个activity,如下所示:
public void callFirst()
{
Intent intent =new Intent(this, FirstAdatperActivity.classs);
// pass position which we was bring from first activity...
intent.putExtra("position", position);
startActivity(intent);
finish();
}
然后您将得到onNewIntent()方法的结果,您可以在第一个活动中覆盖并获取意图数据位置和刷新适配器
recentAdapter.notifyItemChanged(postion, object);
以其他方式,您可以使用此方法调用第二个活动:
Intent intent =new Intent(this, SecondActvity.class);
intent,putExtra("pos",postion);
startActivityForResult(intent, 101);
和第二项活动
Intent intent =new Intent(this, SecondActvity.class);
intent,putExtra("pos",postion);
setresult(101);
然后你会在onActivityResult中得到意图束数据中的位置响应,因此你可以从那里刷新你的适配器。