有这样一个场景,一个列表页,一个内容页,实现方式是用Activity+2个Fragment实现。目前想实现,点击列表页中的某一项,跳转到内容页。
一、代码结构
主Activity:MainActivity.java
列表页:HomeFragment.java
内容页:NewsInfoFragment.java
二、实现方式
由于Fragment之间不能直接通信,必须通过Activity来完成,具体步骤如下:
1.在HomeFragment中定义通信接口,通过该接口向Activity发送数据。
public class HomeFragment extends Fragment implements CustomListView.LoadListener {
View view;
private CustomListView listView;
private List<Article> list = new ArrayList<>();
private ArticleAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.page_home, container, false);
adapter = new ArticleAdapter(view.getContext(), R.layout.listview_item, list);
listView = view.findViewById(R.id.list_view);
listView.setInteface(HomeFragment.this);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Article article = (Article) adapter.getItem(position - 1);
Toast.makeText(view.getContext(), position + " " + article.getTitle(), Toast.LENGTH_SHORT).show();
listener.onSelected(article);
}
});
return view;
}
private onItemClickListener listener;
public interface onItemClickListener {
void onSelected(Article article);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listener = (onItemClickListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement onOkButtonPressed");
}
}
}
2. 在Activity中实现该接口,并通过该接口向NewsInfoFragment.java传递数据。
public class MainActivity extends Activity implements View.OnClickListener, HomeFragment.onItemClickListener {
//其他代码... ...
@Override
public void onSelected(Article article) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
hideFragment(transaction);
if (newsInfoFragment == null) {
newsInfoFragment = NewsInfoFragment.getInstance(article);
transaction.add(R.id.fl_content, newsInfoFragment);
} else {
newsInfoFragment.Load(article);
transaction.show(newsInfoFragment);
}
transaction.commit();
}
}
3.NewsInfoFragment接收数据。
package com.rc.bottombar.ui;
import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.rc.bottombar.R;
import com.rc.bottombar.model.Article;
public class NewsInfoFragment extends Fragment {
private static Article _article;
View view;
TextView title;
//从另外一个Fragment传递过来,供第一次加载
public static NewsInfoFragment getInstance(Article article) {
NewsInfoFragment fragment = new NewsInfoFragment();
Bundle bundle = new Bundle();
_article = article;
fragment.setArguments(bundle);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.page_newsinfo, container, false);
Load(_article);
return view;
}
//外部调用,供更换文章,非第一次加载
public void Load(Article article) {
title = view.findViewById(R.id.txt_home_title);
if (article != null) {
title.setText(article.getTitle());
}
}
}
参考文章: