2013-12-25 2 views
7

Я прочитал много связанных вопросов по этому вопросу. Однако ни один из них не был дан ответ. Я пытаюсь добавить ViewPager в каждую строку в ListView, где есть два макета внутри пейджера. Я считаю, что это выполнимо из-за SwipeListView.ViewPager в элементе списка ListView

Теперь я внедрил его. Тем не менее, пустая страница показывает линию в середине. Строки не отображаются.

Enter image description here

Вот мой код:

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 & FragmentPagerAdapter и оба имеют одинаковый результат.

Я добавил два сообщения журнала в getView() и instantiateItem(), и оба они читаются в логарифмическом режиме, как ожидалось. В LogCat нет ни предупреждений, ни ошибок.

Что мне не хватает?

Update

XML из activity_main

<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> 

XML из pager_item_list

<?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

Сначала очистите свой проект и запустите, скажите мне результат. –

+0

К сожалению, то же самое, я даже попробовал на своем устройстве тот же результат – Coderji

+0

вставить ваши 'R.layout.activity_main' и' R.layout.pager_item_list'. –

ответ

1

Я не уверен, что вы пытаетесь достичь .. Вы хотите изменить когда происходит событие? например, когда вы нажимаете на него? или вы хотите получить тот же результат, что и SwipeListView.

Если вы хотите изменить представление, которое вы пытаетесь использовать, выполните следующие действия: ViewFlipper anc измените компоновку при возникновении события. Но я не уверен, что это результат, который вы хотите

+0

благодарит за ваш ответ, это хороший подход, но не результат, который я ищу. – Coderji

+0

Можете ли вы рассказать мне точный результат, которого вы хотите достичь? Я точно не знаю, чего вы хотите – Crimson

+0

Я хочу иметь ListView, что каждый элемент имеет 2 страницы первой страницы - это имя и значок, затем вы скольжите отображается страница элемента и 2 кнопки, одна для удаления и одна для обновления. тот же результат, что и приложение 'SwipeListView', которое я ранее представил – Coderji

1

ViewPager при использовании внутри строки ListView должен иметь уникальный идентификатор android: id (как в каждой строке должен иметь другой идентификатор). Это связано с тем, что FragmentManager, связанный с адаптером ViewPager, использует идентификатор вместе с положением для хранения фрагментов. Это означает, что если вы просто используете настройки по умолчанию, все будет перезаписано.

Ниже приведен пример 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; 
    } 
} 
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> 

Я не знаю, есть ли лучшее решение, но если вы получите лучшее решение, прокомментируйте!

Смежные вопросы