ListView中的ViewPagers显示空白列表项

时间:2013-11-26 01:12:52

标签: java android xml listview android-viewpager

[编辑] :感谢您提供所有有意义的答案,问题现已解决,感谢您的帮助。类似问题:Android: I am unable to have ViewPager WRAP_CONTENT

我正在尝试实现我的应用的用户界面:我想要ListView每行ViewPager

以下是我的文件:

MainActivity.java

package com.condi;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setListAdapter(new CardListAdapter(this, getFragmentManager()));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

CardListAdapter.java

package com.condi;

import java.util.List;

import android.app.FragmentManager;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class CardListAdapter extends BaseAdapter {

    private Context context;
    private FragmentManager fragmentManager;
    private List<Profile> profiles;

    CardListAdapter(Context context, FragmentManager fragmentManager) {
        this.context = context;
        this.fragmentManager = fragmentManager;
        this.profiles = new DatabaseHelper(context).getProfiles();
    }

    @Override
    public int getCount() {
        return profiles.size();
    }

    @Override
    public Profile getItem(int position) {
        return profiles.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = View.inflate(context, R.layout.profile_card, null);
        CardPagerAdapter mCardPagerAdapter = new CardPagerAdapter(
                fragmentManager);
        ViewPager viewPager = (ViewPager) convertView.findViewById(R.id.pager);
        viewPager.setAdapter(mCardPagerAdapter);
        viewPager.setId(R.id.pager);
        return convertView;
    }
}

profile_card.xml (问题来自wrap_content)。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="4dp"
        android:background="@drawable/card_background"
        android:orientation="vertical" >

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</FrameLayout>

CardPagerAdapter.java

package com.condi;

import android.app.Fragment;
import android.app.FragmentManager;
import android.support.v13.app.FragmentPagerAdapter;

public class CardPagerAdapter extends FragmentPagerAdapter {

    public CardPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new Fragment1();
        case 1:
            return new Fragment2();
        }
        return null;
    }

    @Override
    public int getCount() {
        return 2;
    }
}

Fragment1.java

package com.condi;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {

    public Fragment1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.preference_category, container, false);
    }
}

Fragment2.java

package com.condi;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment2 extends Fragment {

    public Fragment2() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.preference_category, container, false);
    }
}

提供配置文件的数据库运行良好。 问题是我得到一个包含正确项目数的空列表,但根本没有显示ViewPagerscreenshot of my app

我做错了什么?

6 个答案:

答案 0 :(得分:5)

尝试在xml中更改ViewPager的高度。 wrap_content不起作用。

答案 1 :(得分:2)

很明显,在列表视图中使用viewpage是一种不好的做法,因为这个设计会影响ui性能。处理此问题的最佳方法是:

  1. 手动充气浏览器并添加到布局中。

  2. 为每个viewpager添加一个唯一ID,以便系统唯一识别它。

  3. 扩展自定义viewpager和onmeasure()测量在所选页面上膨胀的子布局。您可以通过在自定义viewpager中设置回调来触发来自viewpage onPageScrolled侦听器的回调,并传递位置以标识子布局。
  4. 在onMeaure()方法中,使用super.onMeasure()传递新测量的规格,测量子布局高度并将其设置为viewpagers高度。
  5. 需要注意的要点:

    N.B。为您膨胀的viewpager设置唯一ID。

答案 2 :(得分:2)

在布局高度

中尝试此问题
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="4dp"
    android:layout_marginLeft="6dp"
    android:layout_marginRight="6dp"
    android:layout_marginTop="4dp"
    android:background="@drawable/card_background"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 </LinearLayout>

</FrameLayout>

答案 3 :(得分:1)

wrap_content用于viewpager的高度是一种不好的做法。您可以使用match_parent或静态dp作为viewpager的高度。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="4dp"
        android:background="@drawable/card_background"
        android:orientation="vertical" >

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

</FrameLayout>

如果必须为viewpager的高度使用wrap_content,则可以覆盖viewpager的onMeasure()并计算高度。下面是一个关于它的例子。

Android: I am unable to have ViewPager WRAP_CONTENT

我希望这对你有所帮助。

答案 4 :(得分:0)

ViewPager现在不支持wrap_content,因为它不会同时加载所有子进程,这意味着它无法获得适当的度量。您必须在xml中修复View的高度或创建自定义ViewPager(在here阅读更多内容)并在xml中使用它

答案 5 :(得分:0)

尝试在ViewPager内使用固定高度ListViewViewPager不支持wrap_content