2

我爲listview做了一個customadapter,但由於某種原因,getView方法的參數「position」始終爲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!

這裏是在ListView的項目的XML layput:

<?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等等, 我不明白爲什麼我不這樣做。

如果有更多的信息需要解決這個問題,請直接詢問。 任何幫助將不勝感激。

編輯:

我剛剛發現了一些非常奇怪的東西。我嘗試像這樣在列表中添加另一項:

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

結果與以前完全一樣。在終端中只有2個Syso,寫出0(位置變量)。此外,列表視圖中只有2個項目,即使我已將3添加到適配器。

這意味着getview對於一個項目被調用兩次,然後剩下的項目不會被調用。

但是,我仍然不知道爲什麼會發生這種情況。

+0

Charef是對的。當你要求它返回ItemId的位置時,你要求返回0。 – SmulianJulian

+0

通過添加更多詳細信息幫助我們瞭解您的問題 –

+0

您是否替換了返回0;與返回位置; ? –

回答

1

我找到了解決方案。即使它沒有任何意義對我來說,那就是:

通過從WRAP_CONTENT/match_parent改變的RelativeLayout容器的高度和寬度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:第i個比較我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 parent)。上面的Edit2沒有解決這個問題,我很害怕:( – Langkiller

1

在您的來電CreateProgramAdapter,我懷疑你沒有傳遞正確的背景下您的適配器。 變化來自:

new CreateProgramAdapter(CreateProgramActivity.this, ... 

TO:

new CreateProgramAdapter(getActivity(), ... 

注:

  • CreateProgramActivity必須在範圍靜態的,但我覺得這是不正確的活動的時候,有時它是更具活力。方法getActivity更準確,如果代碼在片段中很容易做到。然而,獲得正確的活動可能很困難。讓我們試試看...
+0

謝謝,但我似乎無法調用getActivity方法。它是特定類的一部分?Android Studio無法找到該方法。如果強制它調用getActivity()反正它說「無法解析方法getActivity ()「 – Langkiller

+0

查看我對該問題的編輯 – Langkiller

+0

我找到了解決方案並自己發佈了一個答案,不管怎樣,非常感謝您的幫助。Upvoted。 – Langkiller

0

將ListView控件的佈局寬度和高度更改爲「match_parent」。

5

如果您將ListView放置在ScrollView中,則會發生此錯誤。 ListView本身做垂直滾動,所以它不能放入ScrollView。

當listView需要顯示新項目時,適配器將調用getView。所以,如果你的listView不滾動,不會創建新的項目,也不會調用getView。

+0

如果我們需要在scrollview中放置listview,這是什麼解決方案... – Tarun

+0

這取決於,對我來說這是一個解決方案,因爲我需要在子ListView上顯示少量項目http://stackoverflow.com/questions/18353515/how-to-make-multiplelistview-in-scrollview/18354096#18354096 take一看,看看這是否會爲你工作。 – delkant