在Android开发中,Activity之间的数据传递通常通过Intent实现。当我们需要从Adapter(通常是RecyclerView.Adapter)向Activity传递数据时,主要有以下几种方法:
// 1. 在Adapter中定义接口
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
private List<NewsItem> newsList;
private OnItemClickListener listener;
public interface OnItemClickListener {
void onItemClick(NewsItem newsItem);
}
public NewsAdapter(List<NewsItem> newsList, OnItemClickListener listener) {
this.newsList = newsList;
this.listener = listener;
}
// ... 其他Adapter代码 ...
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
NewsItem newsItem = newsList.get(position);
holder.itemView.setOnClickListener(v -> {
if (listener != null) {
listener.onItemClick(newsItem);
}
});
}
}
// 2. 在Activity中实现接口
public class MainActivity extends AppCompatActivity implements NewsAdapter.OnItemClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<NewsItem> newsList = getNewsList(); // 获取新闻列表数据
NewsAdapter adapter = new NewsAdapter(newsList, this);
recyclerView.setAdapter(adapter);
}
@Override
public void onItemClick(NewsItem newsItem) {
// 启动NewsActivity并传递数据
Intent intent = new Intent(this, NewsActivity.class);
intent.putExtra("news_item", newsItem);
startActivity(intent);
}
}
// 3. 在NewsActivity中接收数据
public class NewsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news);
NewsItem newsItem = (NewsItem) getIntent().getSerializableExtra("news_item");
// 使用newsItem数据更新UI
}
}
// 在Adapter中直接启动Activity
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
private List<NewsItem> newsList;
private Context context;
public NewsAdapter(List<NewsItem> newsList, Context context) {
this.newsList = newsList;
this.context = context;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
NewsItem newsItem = newsList.get(position);
holder.itemView.setOnClickListener(v -> {
Intent intent = new Intent(context, NewsActivity.class);
intent.putExtra("news_item", newsItem);
context.startActivity(intent);
});
}
}
// 1. 创建共享ViewModel
public class SharedViewModel extends ViewModel {
private final MutableLiveData<NewsItem> selectedNews = new MutableLiveData<>();
public void select(NewsItem newsItem) {
selectedNews.setValue(newsItem);
}
public LiveData<NewsItem> getSelectedNews() {
return selectedNews;
}
}
// 2. 在Adapter中更新ViewModel
holder.itemView.setOnClickListener(v -> {
sharedViewModel.select(newsItem);
context.startActivity(new Intent(context, NewsActivity.class));
});
// 3. 在NewsActivity中观察数据
public class NewsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news);
SharedViewModel model = new ViewModelProvider(this).get(SharedViewModel.class);
model.getSelectedNews().observe(this, newsItem -> {
// 更新UI
});
}
}
推荐使用方法1(接口回调),因为它:
问题1:传递的数据在目标Activity中为null
问题2:点击无反应
问题3:传递大数据时卡顿