Ответ 1
Прежде всего. Я не очень уверен, насколько это серьезно, потому что вы пытаетесь использовать view pager в качестве элемента списка. Это не то, что это невозможно, но это просто, что здесь слишком много слоев. Надеюсь, вы по достоинству оцените работу и усилия, внесенные в этот кусок кода, и я надеюсь, что это поможет вам решить проблему. Так что наслаждайтесь кодом..:)
1) В этом случае есть 2 адаптера. Сначала для ListView Второй для ViewPager
2) Оба адаптера имеют разные функции и элементы списка.
3) Вы используете один адаптер в другом адаптере.
4) Затем вы используете финальный адаптер для раздувания вашего ListView и установки адаптера...: D
Вот как идет код: Я буду делать это шаг за шагом
Шаг 1: Создание простого класса модели:
public class ModelClass {
private String titleToDisplay;
public ModelClass(String question) {
super();
this.titleToDisplay = question;
}
public String getTitleToDisplay() {
return titleToDisplay;
}
public void setTitleToDisplay(String titleToDisplay) {
this.titleToDisplay = titleToDisplay;
}
}
Шаг 2: Создание пейджера представления. Адаптер и раздутие его будут элементами класса модели. Это базовый адаптер пейджера!
public class ViewPagerAdapter extends PagerAdapter {
ArrayList<ModelClass> arrayModelClasses = new ArrayList<ModelClass>();
@SuppressLint("NewApi")
@Override
public void finishUpdate(ViewGroup container) {
// TODO Auto-generated method stub
super.finishUpdate(container);
}
public ViewPagerAdapter() {
super();
}
public ViewPagerAdapter(ArrayList<ModelClass> arrayModelClasses) {
super();
this.arrayModelClasses = arrayModelClasses;
}
@Override
public int getCount() {
return arrayModelClasses.size();
}
@Override
public boolean isViewFromObject(View collection, Object object) {
return collection == ((View) object);
}
@Override
public Object instantiateItem(View collection, int position) {
// Inflating layout
LayoutInflater inflater = (LayoutInflater) collection.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.drawer_list_item, null);
TextView itemText = (TextView) view.findViewById(R.id.title);
try {
itemText.setText(arrayModelClasses.get(position)
.getTitleToDisplay());
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
((ViewPager) collection).addView(view, 0);
return view;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView((View) object);
}
}
Шаг 3. Создание адаптера для ListView
ПРИМЕЧАНИЕ: Здесь я использую предыдущий адаптер, и в этом адаптере я использую пейджер представления как элемент списка.
public class ListViewPagerAdapter extends ArrayAdapter<ModelClass> {
ViewPagerAdapter mViewPagerAdapter;
private Context context;
private ArrayList<ModelClass> navigationItems;
private int selectedIndex;
public ListViewPagerAdapter(Context context,
ArrayList<ModelClass> navigationItems) {
super(context, R.layout.view_pager_list_view, navigationItems);
this.context = context;
this.navigationItems = navigationItems;
}
@Override
public int getCount() {
return navigationItems.size();
}
public void setSelectedIndex(int position) {
selectedIndex = position;
notifyDataSetChanged();
}
@Override
public ModelClass getItem(int position) {
return navigationItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressLint("NewApi")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.view_pager_list_view, null);
}
ViewPager vp = (ViewPager) convertView.findViewById(R.id.list_pager);
if (selectedIndex != -1 && position == selectedIndex) {
vp.setBackground(getContext().getResources().getDrawable(
R.drawable.gradient_selected));
} else {
vp.setBackground(getContext().getResources().getDrawable(
R.drawable.gradient));
}
mViewPagerAdapter = new ViewPagerAdapter(navigationItems);
vp.setAdapter(mViewPagerAdapter);
return convertView;
}
}
Шаг 4: Я устанавливаю этот последний адаптер ( "ListViewPagerAdapter" ) в свой список.
ПРИМЕЧАНИЕ: Здесь я использую этот адаптер в одном из моих фрагментов. Вы можете использовать это просто в своем обычном классе активности, и он тоже будет работать.
public class CampaignView extends Fragment {
ListViewPagerAdapter listViewPagerAdapter;
public CampaignView() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View campainview = inflater.inflate(R.layout.campaignview, container,
false);
return campainview;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
String[] s = { "a", "b", "c", "d", "b", "c", "d", "b", "c", "d", "b",
"c", "d", "b", "c", "d", "b", "c", "d" };
ArrayList<ModelClass> aList = new ArrayList<ModelClass>();
for (String s1 : s) {
aList.add(new ModelClass(s1));
}
ListView lv1 = (ListView) getActivity().findViewById(
R.id.campaignListView);
// lv1.setAdapter(new ArrayAdapter<String>(getActivity(),
// android.R.layout.simple_list_item_1,aList));
listViewPagerAdapter = new ListViewPagerAdapter(getActivity(), aList);
lv1.setAdapter(listViewPagerAdapter);
}
}
Наконец, для этого кода есть несколько фрагментов макетов.
Сначала:. Список:
<ListView
android:id="@+id/campaignListView"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
Второе: ViagerLayoutItem (строки):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/list_pager"
android:layout_width="match_parent"
android:layout_height="400dp"
android:paddingTop="10dp"/>
</LinearLayout>
Наконец: Элементы списка ящиков для элементов списка:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#303030"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#303030"
android:orientation="horizontal" >
<ImageView
android:id="@+id/icon"
android:layout_width="25dp"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:contentDescription="Icon"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@android:color/darker_gray"
android:minHeight="18dp"
android:padding="20dp"
android:paddingRight="40dp"
android:text="home"
android:textColor="#33b5e5"
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
Изображение для работы:
Изображения http://imageshack.com/a/img855/109/5w7e.png Изображения http://imageshack.com/a/img849/860/8j5t.png
Дайте мне знать, есть ли какие-либо сомнения в этом коде. Я буду рад ответить.
Надеюсь, вам понравилось, и я желаю вам всего наилучшего реализовать это. Я потратил несколько минут на этот кусок кода. Надеюсь, это поможет всем.. Удачи..:)