【发布时间】:2013-09-06 11:47:02
【问题描述】:
当我尝试用 ViewPager 中的另一个替换 Fragment 时遇到一些问题。
现状
我有一个ViewPager,有 3 页,每一页都是一个Fragment。在第一页,我在ListFragment(“FacturasFragment”)中有一个ListView。当我点击该列表中的一项时,我使用onListItemClick 方法来处理该事件。
我想要什么
- 单击列表项时,我想将
ListFragment(包含发票列表)替换为另一个Fragment(“DetallesFacturaFragment”,包含发票详细信息)。 - 当我在“DetallesFacturaFragment”并按返回
Button时,应返回ListFragment。 - 页面之间的滚动不应改变第一个页面中显示的
Fragment。如果我在第一页中显示“DetallesFacturaFragment”并滚动到第二页,则返回第一页时应继续显示“DetallesFacturaFragment”。
代码
片段活动
public class TabsFacturasActivity extends SherlockFragmentActivity {
private MyAdapter mAdapter;
private ViewPager mPager;
private PageIndicator mIndicator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mIndicator = (TitlePageIndicator)findViewById(R.id.indicator);
mIndicator.setViewPager(mPager);
}
private static class MyAdapter extends FragmentPagerAdapter {
private String[] titles = { "VER FACTURAS", "VER CONSUMO", "INTRODUCIR LECTURA" };
private final FragmentManager mFragmentManager;
private Fragment mFragmentAtPos0;
private Context context;
public MyAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
mFragmentManager = fragmentManager;
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0: // Fragment # 0
return new FacturasFragment();
case 1: // Fragment # 1
return new ConsumoFragment();
case 2:// Fragment # 2
return new LecturaFragment();
}
return null;
}
@Override
public int getCount() {
return titles.length;
}
@Override
public int getItemPosition(Object object)
{
if (object instanceof FacturasFragment && mFragmentAtPos0 instanceof DetallesFacturaFragment)
return POSITION_NONE;
return POSITION_UNCHANGED;
}
}
}
列表片段
public class FacturasFragment extends ListFragment {
private ListView lista;
private ArrayList<TuplaFacturaWS> facturas;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.activity_facturas, container, false);
facturas = myApplication.getFacturas();
lista = (ListView) view.findViewById(id.list);
MyAdapter myAdaptador = new MyAdapter(this, facturas);
setListAdapter(myAdaptador);
return view;
}
public void onListItemClick (ListView l, View v, int position, long id) {
myApplication.setFacturaActual(position);
mostrarDatosFactura();
}
private void mostrarDatosFactura() {
final DetallesFacturaFragment fragment = new DetallesFacturaFragment();
FragmentTransaction transaction = null;
transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.pager, fragment); //id of ViewPager
transaction.addToBackStack(null);
transaction.commit();
}
private class MyAdapter extends BaseAdapter {
private final FacturasFragment actividad;
private final ArrayList<TuplaFacturaWS> facturas;
public MyAdapter(FacturasFragment facturasActivity, ArrayList<TuplaFacturaWS> facturas) {
super();
this.actividad = facturasActivity;
this.facturas = facturas;
}
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
LayoutInflater inflater = actividad.getLayoutInflater(null);
View view = inflater.inflate(R.layout.list_row, null, true);
//Set data to view
return view;
}
@Override
public int getCount() {
return facturas.size();
}
@Override
public Object getItem(int pos) {
return facturas.get(pos);
}
@Override
public long getItemId(int position) {
return position;
}
private OnClickListener checkListener = new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
};
}
}
片段
public class DetallesFacturaFragment extends SherlockFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.activity_factura, container, false);
//Set data to view
return view;
}
}
目前,当我单击列表项时,第一页出现白色视图。我已经验证并执行了“DetallesFacturaFragment”的onCreateView 方法,但该页面上没有显示任何内容。
当我第一次点击列表项时,它会显示那个白屏。但是回到列表后,我必须单击两次才能显示白屏。
我一直在谷歌上搜索并查看了很多问题,但找不到任何人用完整的代码解决了问题。
【问题讨论】:
-
使用嵌套片段。第一个页面将是一个持有者片段,当您创建它时,您将在其中最初添加当前的
ListFragment。当您单击列表项时,然后将嵌套的ListFragment替换为同一持有者片段中的嵌套详细信息片段。不要在那个细节片段上使用setRetainInstance()。 -
为什么要使用嵌套片段?我不知道。
-
因为您不能像您那样简单地将片段放在
ViewPager上。阅读嵌套片段,它们并不难使用。 -
我终于实现了我的目标,我可以替换
Fragments。 -
@Lyd 你介意分享一下你是怎么做到的吗!?
标签: android listview android-fragments android-viewpager