我已经阅读了很多关于这个问题的相关问题。然而,他们都没有得到回答。我正在尝试向ViewPager
中的每一行添加ListView
,其中寻呼机中有两个布局。我认为这是可行的,因为 SwipeListView 。
现在我已经实现了它。但是,显示空白页面,中间有一条线。没有出现任何行。
这是我的代码:
MainActivity + ArrayAdapter
public class MainActivity extends Activity {
ListView list;
String[] heros;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
heros = getResources().getStringArray(R.array.heros);
list = (ListView) findViewById(R.id.listView1);
list.setAdapter(new CustomAdapter(this, heros));
}
public class CustomAdapter extends ArrayAdapter<String>
{
String[] heros;
Context context;
public CustomAdapter(Context context, String[] heros) {
super(context, R.layout.pager_item_list, R.id.listView1, heros);
// TODO Auto-generated constructor stub
this.heros = heros;
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.pager_item_list, parent, false);
Log.d("how many times", "I really don't know how it should be");
ViewPager pager = (ViewPager) row.findViewById(R.id.pager);
pager.setId(position);
pager.setAdapter(new PagerCustomAdapter());
pager.setCurrentItem(0);
return row;
}
}
}
这是我的pageAdapter
public class PagerCustomAdapter extends PagerAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return 2;
}
@Override
public Object instantiateItem(View container, int position) {
// TODO Auto-generated method stub
LayoutInflater inflater = (LayoutInflater) container.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int id = 0;
Log.d("I am in pagerAdater", "I am here, dammit!");
switch(position)
{
case 0:
id = R.layout.fragment_top_item;
break;
case 1:
id = R.layout.fragment_bottom_item;
break;
}
View view = inflater.inflate(id, null);
((ViewPager)container).addView(view, 0);
return view;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == ((View) arg1);
}
@Override
public Parcelable saveState() {
return null;
}
}
我试过了pagerAdapter
&amp; FragmentPagerAdapter
并且两者都有相同的结果
我在getView()
和instantiateItem()
中添加了两条日志消息,两者都按预期在logcat中读取。 LogCat中既没有警告也没有错误。
我错过了什么?
更新
activity_main的XML
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
</ListView>
</RelativeLayout>
pager_item_list的XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</android.support.v4.view.ViewPager>
</LinearLayout>
答案 0 :(得分:1)
我不确定你想要实现什么..你想在事件发生时改变观点吗?比如当你点击它?或者你想要像SwipeListView一样的结果。
如果您想更改视图,则可以尝试使用ViewFlipper anc在事件发生时更改布局。但我不确定这是否是你想要的结果
答案 1 :(得分:1)
在ListView行中使用时,ViewPager需要具有唯一的android:id(因为每行必须具有不同的id)。这是因为与ViewPager适配器关联的FragmentManager使用id以及存储片段的位置。这意味着如果你只是使用默认值,那么事情就会被覆盖。
下面是一个示例PagerAdapter,它允许您覆盖默认的makeFragmentName方法。
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Parcelable;
import android.support.v13.app.FragmentCompat;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
public abstract class TaggedFragmentPagerAdapter extends PagerAdapter {
private final FragmentManager mFragmentManager;
private FragmentTransaction mCurTransaction = null;
private Fragment mCurrentPrimaryItem = null;
public TaggedFragmentPagerAdapter(FragmentManager fm) {
mFragmentManager = fm;
}
/**
* Return the Fragment associated with a specified position.
*/
public abstract Fragment getItem(int position);
public String getItemTag(int position) {
// Maintain backward compatibility
return String.valueOf(getItemId(position));
}
@Override
public void startUpdate(ViewGroup container) {
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
// Do we already have this fragment?
String name = makeFragmentName(position, container.getId(), getItemTag(position));
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
// FIXME : Start fix.
if (!fragment.isDetached()) {
mCurTransaction.detach(fragment);
}
// FIXME : End fix.
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
mCurTransaction.add(container.getId(), fragment, name);
}
if (fragment != mCurrentPrimaryItem) {
FragmentCompat.setMenuVisibility(fragment, false);
FragmentCompat.setUserVisibleHint(fragment, false);
}
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
mCurTransaction.detach((Fragment) object);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment) object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
FragmentCompat.setMenuVisibility(mCurrentPrimaryItem, false);
FragmentCompat.setUserVisibleHint(mCurrentPrimaryItem, false);
}
if (fragment != null) {
FragmentCompat.setMenuVisibility(fragment, true);
FragmentCompat.setUserVisibleHint(fragment, true);
}
mCurrentPrimaryItem = fragment;
}
}
@Override
public void finishUpdate(ViewGroup container) {
if (mCurTransaction != null) {
mCurTransaction.commitAllowingStateLoss();
mCurTransaction = null;
mFragmentManager.executePendingTransactions();
}
}
@Override
public boolean isViewFromObject(View view, Object object) {
return ((Fragment) object).getView() == view;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
/**
* Return a unique identifier for the item at the given position.
*
* <p> The default implementation returns the given position. Subclasses should override this method if the positions of items
* can change. </p>
*
* @param position Position within this adapter
* @return Unique identifier for the item at position
*/
public long getItemId(int position) {
return position;
}
protected String makeFragmentName(int position, int viewId, String tagName) {
return "android:switcher:" + viewId + ":" + tagName;
}
}
答案 2 :(得分:0)
我遇到了类似的问题,我所做的是明确设置viewPager及其父级的高度。这对我有用。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="200dip"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="200dip" >
</android.support.v4.view.ViewPager>
</LinearLayout>
我不知道是否有更好的解决方案,但如果你有更好的解决方案,请发表评论!