2

Я создал пользовательский адаптер для списка, но по какой-либо причине параметр «position» метода getView всегда равен 0, что делает метод довольно бесполезным.Android customAdapter (BasesAdapter) getView всегда возвращается 0

Вот код моего customAdapter, простираясь BaseAdapter:

public class CreateProgramAdapter extends BaseAdapter { 

    private LayoutInflater inflater; 
    private ArrayList<TrainingPass> trainingPasses; 
    private List<TrainingPass> items; 
    private Context context; 

    public CreateProgramAdapter(Context context, List<TrainingPass> items) { 
     this.context = context; 
     this.items = items; 
     this.inflater = LayoutInflater.from(this.context); 
    } 

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

    @Override 
    public TrainingPass getItem(int position) { 
     return items.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view; 
     TrainingPassHolder holder; 

     if(convertView == null) { 
      view = inflater.inflate(R.layout.adapter_createprogram_trainingpasses_item, parent, false); 
      holder = new TrainingPassHolder(); 

      System.out.println(position); 
      holder.trainingPass = this.getItem(position); 
      holder.trainingPassContainer = (RelativeLayout) view.findViewById(R.id.trainingPassContainer); 
      holder.trainingPassHeadlineShowHide = (TextView) view.findViewById(R.id.trainingpass_headline); 
      holder.noExercisesYet = (TextView) view.findViewById(R.id.txt_no_exercises_yet); 
      holder.exerciseSearchField = (EditText) view.findViewById(R.id.trainingpass_exercise_searchfield); 
      holder.trainingPassSetsListView = (ListView) view.findViewById(R.id.trainingpass_sets_listview); 
      holder.exercisesListView = (ListView) view.findViewById(R.id.exercises_listview); 
      holder.addSetButton = (Button) view.findViewById(R.id.add_set_button); 
      holder.addExerciseButton = (Button) view.findViewById(R.id.add_exercise_button); 


      holder.trainingPassContainer.setTag(holder.trainingPass); 
      holder.trainingPassHeadlineShowHide.setTag(holder.trainingPass); 
      holder.noExercisesYet.setTag(holder.trainingPass); 
      holder.exerciseSearchField.setTag(holder.trainingPass); 
      holder.trainingPassSetsListView.setTag(holder.trainingPass); 
      holder.exercisesListView.setTag(holder.trainingPass); 
      holder.addSetButton.setTag(holder.trainingPass); 
      holder.addExerciseButton.setTag(holder.trainingPass); 

      view.setTag(holder); 

     } else { 
      view = convertView; 
      holder = (TrainingPassHolder)view.getTag(); 
     } 

     setupItems(holder); 

     return view; 
    } 


    private void setupItems(TrainingPassHolder trainingPassHolder) { 
     int id = trainingPassHolder.trainingPass.trainingPassID; 
     TextView showHide = trainingPassHolder.trainingPassHeadlineShowHide; 

     showHide.setText("Trainingpass " + id); 
    } 

    private class TrainingPassHolder { 
     TrainingPass trainingPass; 
     RelativeLayout trainingPassContainer; 
     TextView  trainingPassHeadlineShowHide; 
     TextView  noExercisesYet; 
     EditText  exerciseSearchField; 
     ListView  trainingPassSetsListView; 
     ListView  exercisesListView; 
     Button   addSetButton; 
     Button   addExerciseButton; 
    } 
} 

Как вы видите, я syso'ing из положения, которое всегда 0!

Вот XML layput для элементов в ListView:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:orientation="horizontal" 
    android:padding="10dp"> 

    <TextView 
     android:id="@+id/trainingpass_headline" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="false" 
     android:layout_alignParentTop="true" 
     android:text="Trainingpass" 
     android:textSize="18dp" 
     android:textColor="@android:color/white" 
     android:background="@android:color/holo_blue_dark" 
     android:height="35dp" 
     android:gravity="center_vertical" 
     android:paddingLeft="10dp" 
     android:textIsSelectable="true" 
     android:textStyle="bold" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_marginTop="10dp" /> 

    <ImageView 
     android:id="@+id/trainingpass_showhide_imageview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/abc_spinner_mtrl_am_alpha" 
     android:background="@android:color/holo_blue_dark" 
     android:height="30dp" 
     android:minWidth="50dp" 
     android:layout_alignParentTop="true" 
     android:layout_above="@+id/trainingPassContainer" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_marginTop="10dp" /> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_below="@+id/trainingpass_headline" 
     android:layout_alignLeft="@+id/trainingpass_headline" 
     android:layout_alignStart="@+id/trainingpass_headline" 
     android:id="@+id/trainingPassContainer" 
     android:background="@color/blue_bg_neutral" 
     android:layout_marginBottom="10dp" 
     android:visibility="visible"> 

     <EditText 
      android:id="@+id/trainingpass_exercise_searchfield" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:hint="Name of exercise" 
      android:padding="6dp" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentEnd="true" 
      android:background="@color/blue_bg_inputField" 
      android:layout_margin="10dp" /> 

     <RelativeLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/trainingpass_exercise_searchfield" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:id="@+id/sets_container" 
      android:background="@color/blue_bg_inputField" 
      android:layout_margin="10dp" 
      android:padding="10dp"> 

      <TextView 
       android:id="@+id/txt_sets_for_exercise" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Sets for exercise" 
       android:textSize="14dp" 
       android:textColor="@android:color/black" 
       android:paddingRight="30dp" 
       android:paddingLeft="0dp" 
       android:paddingTop="0dp" 
       android:paddingBottom="10dp" 
       android:textStyle="bold" 
       android:layout_alignParentTop="true" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" 
       android:layout_alignRight="@+id/add_set_button" 
       android:layout_alignEnd="@+id/add_set_button" /> 

      <ListView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/trainingpass_sets_listview" 
       android:nestedScrollingEnabled="true" 
       android:layout_alignParentRight="true" 
       android:layout_alignParentEnd="true" 
       android:layout_alignBottom="@+id/txt_sets_for_exercise" 
       android:layout_below="@+id/txt_sets_for_exercise" /> 

      <Button 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Add set" 
       android:id="@+id/add_set_button" 
       android:layout_below="@+id/trainingpass_sets_listview" 
       android:layout_alignParentRight="true" 
       android:layout_alignParentEnd="true" /> 

      <Button 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Add exercise" 
       android:id="@+id/add_exercise_button" 
       android:layout_below="@+id/add_set_button" 
       android:layout_alignParentRight="true" 
       android:layout_alignParentEnd="true" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" /> 
     </RelativeLayout> 

     <RelativeLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentEnd="true" 
      android:layout_below="@+id/sets_container" 
      android:id="@+id/exercises_container" 
      android:background="@color/blue_bg_inputField" 
      android:layout_margin="10dp" 
      android:padding="10dp"> 

      <TextView 
       android:id="@+id/txt_exercises" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Exercises" 
       android:textSize="14dp" 
       android:textColor="@android:color/black" 
       android:paddingRight="30dp" 
       android:paddingLeft="0dp" 
       android:paddingTop="0dp" 
       android:paddingBottom="10dp" 
       android:textStyle="bold" 
       android:layout_alignParentTop="true" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" 
       android:layout_alignRight="@+id/txt_no_exercises_yet" 
       android:layout_alignEnd="@+id/txt_no_exercises_yet" /> 

      <TextView 
       android:id="@+id/txt_no_exercises_yet" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="No exercises yet" 
       android:textSize="14dp" 
       android:textColor="@android:color/black" 
       android:paddingRight="30dp" 
       android:paddingLeft="10dp" 
       android:paddingTop="20dp" 
       android:paddingBottom="10dp" 
       android:layout_below="@+id/txt_exercises" 
       android:layout_alignParentRight="true" 
       android:layout_alignParentEnd="true" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" /> 

      <ListView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/exercises_listview" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" 
       android:layout_alignTop="@+id/txt_no_exercises_yet" 
       android:layout_above="@+id/txt_no_exercises_yet" /> 

     </RelativeLayout> 

    </RelativeLayout> 

</RelativeLayout> 

И вот код, где я звоню CreateProgramAdapter:

ArrayList<TrainingPass> trainingPasses = new ArrayList<TrainingPass>(); 

     TrainingPass trainingPass = new TrainingPass(); 
     trainingPass.trainingPassName = "wefwef"; 
     trainingPass.trainingPassID = 1; 

     TrainingPass trainingPass2 = new TrainingPass(); 
     trainingPass2.trainingPassName = "rwefhtr"; 
     trainingPass2.trainingPassID = 2; 

     trainingPasses.add(trainingPass); 
     trainingPasses.add(trainingPass2); 

     ListView trainingPassesListView = (ListView)findViewById(R.id.listView_trainingpasses); 
     CreateProgramAdapter createProgramAdapter = new CreateProgramAdapter(CreateProgramActivity.this, trainingPasses); 
     trainingPassesListView.setAdapter(createProgramAdapter); 

Независимо от того, сколько элементов вставлены в представлении списка расположение адаптеров в методе getView всегда равно 0. Очевидно, я хочу, чтобы он возвращал 0 только для первого элемента, затем 1 и 2 и т. д. Я не могу понять, почему я этого не делаю ,

Если у вас есть больше информации, необходимой для решения проблемы, просто спросите. Любая помощь будет принята с благодарностью.

EDIT:

Я только что обнаружил, что-то действительно странное. Я попытался добавить еще один элемент в список:

TrainingPass trainingPass3 = new TrainingPass(); 
    trainingPass3.trainingPassName = "ffffrwwewefefhtr"; 
    trainingPass3.trainingPassID = 3; 

Результат такой же, как и раньше. В терминале только 2 Syso's, выписав 0 (переменная положения). Также в списке есть только 2 элемента, хотя я добавил 3 к адаптеру.

Это должно означать, что getview вызывается дважды для одного элемента, а затем остальные элементы не вызываются.

Но все же я не знаю, почему это происходит.

+0

Charef is right. Ваш запрос на возврат 0, когда должен попросить его вернуть позицию ItemId. – SmulianJulian

+0

помогите нам понять вашу проблему, добавив более подробную информацию. –

+0

Вы заменили return 0; с возвратной позицией; ? –

ответ

1

Я нашел решение. Несмотря на то, что не имеет смысла для меня, вот это:

Изменяя ширину и высоту контейнера RelativeLayout от wrap_content/match_parent к fill_parent, проблема была решена:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center_horizontal" 
    android:orientation="horizontal" 
    android:padding="10dp"> 

Благодаря все, кто разместил ответы и комментарии, чтобы помочь решить проблему. Я ценю это.

+0

Это не имеет никакого смысла для меня. Я пробовал в любом случае, но не работал Я не понимаю, что это решение. – delkant

2

заменить этот

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

с этим

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

Edit2: сравнение Ith мой baseadapter я предлагаю следующее

заменить этот

holder.trainingPass = this.getItem(position); 

этим

holder.trainingPass = items.getItem(position); 
+0

спасибо за ваш ответ. Я полностью забыл об этом, но, к сожалению, переменная позиции все еще 0. – Langkiller

+0

Я сравню ваш адаптер с моим .. –

+0

Спасибо. Проблема заключается в переменной «position», которая является одним из параметров метода getView. - public View getView (int position, View convertView, родительская группа ViewGroup). Вышеизложенное Edit2 не решило проблему im fear :( – Langkiller

1

В вашем вызове CreateProgramAdapter, я подозреваю, что вы не передаете правильный контекст для адаптера. Изменения от:

new CreateProgramAdapter(CreateProgramActivity.this, ... 

TO:

new CreateProgramAdapter(getActivity(), ... 

Примечание:

  • CreateProgramActivity должен быть статическим в объеме, но я чувствую, что это не правильная деятельность всего времени, иногда более динамичный. Метод getActivity более точный, простой в использовании, если код находится в фрагменте. Однако получение правильной деятельности может быть затруднено. Давайте попробуем это и посмотрим ...
+0

Спасибо, но я не могу назвать метод getActivity. Является ли это частью определенного класса? Android Studio не может найти этот метод. Если я заставил его вызвать getActivity(), в любом случае он говорит: «Невозможно разрешить метод getActivity() « – Langkiller

+0

Отметьте мое редактирование на вопрос. – Langkiller

+0

Я нашел решение и отправил ответ сам. В любом случае большое спасибо за вашу помощь. – Langkiller

0

Измените ширину и высоту виджета виджета ListView на "match_parent".

5

Эта ошибка произойдет, если вы поместите ListView внутри ScrollView. ListView сам выполняет вертикальную прокрутку, поэтому ее нельзя вводить в ScrollView.

Адаптер вызовет getView, когда listView потребуется новый элемент для отображения. Итак, если ваш listView не прокручивается, новый элемент не создается, и нет вызова getView.

+0

Что это за решение, если нам нужно поставить listview внутри scrollview ... – Tarun

+0

Это зависит, для меня это было решением, так как мне нужно было отображать несколько элементов в дочернем элементе ListView http://stackoverflow.com/questions/18353515/how-to-make-multiplelistview-in-scrollview/18354096#18354096 взгляните и посмотрите, будет ли это работать для вас. – delkant

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