2013-05-02 91 views
25

以下是我將自定義適配器設置到列表中的片段的代碼。不調用自定義適配器getView()方法

有沒有錯誤,但ListView是空的。我已經實現了getCount(),它在我的ArrayList中返回正確數量的項目。我沒有看到("Inside", "GetView")在logcat的

片段

public class ServiceCarListFragment extends Fragment { 

    private String url; 
    private ArrayList<CarDetail> carDetailList = new ArrayList<CarDetail>(); 
    private CarListAdapter adapter; 
    private ListView mList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     url = getActivity().getIntent().getStringExtra("url"); 
     new DownloadCarDetail().execute(url); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     View v = inflater.inflate(R.layout.fragment_service_car_list, container, false); 
     mList = (ListView) v.findViewById(R.id.list); 
     mList.setAdapter(adapter); 

     for (CarDetail car : carDetailList) { 
      // START LOADING IMAGES FOR EACH STUDENT 
      car.loadImage(adapter); 
     } 
     return v; 
    } 

    class DownloadCarDetail extends AsyncTask<String, String, ArrayList<CarDetail>> { 

     @Override 
     protected ArrayList<CarDetail> doInBackground(String... params) { 
      // TODO Auto-generated method stub 
      ArrayList<CarDetail> carDetailList = JsonParser.parseJson(params[0]); 
      return carDetailList; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<CarDetail> carDetailList) { 
      // TODO Auto-generated method stub 
      ServiceCarListFragment.this.carDetailList = carDetailList; 
      Log.d("dccs", String.valueOf(ServiceCarListFragment.this.carDetailList.size())); 
      adapter = new CarListAdapter(getActivity(), ServiceCarListFragment.this.carDetailList); 
      Log.d("dccs", String.valueOf((adapter.getCount()))); 
     } 

    } 
} 

CustomAdapter

public class CarListAdapter extends BaseAdapter { 

    private ArrayList<CarDetail> items = new ArrayList<CarDetail>(); 
    private Context context; 

    public CarListAdapter(Context context, ArrayList<CarDetail> items) { 
     this.context = context; 
     this.items = items; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return items.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return items.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     Log.d("Inside", "GetView"); 
     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     ViewHolder holder = null; 
     CarDetail car = items.get(position); 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.car_list_row, null); 
      holder = new ViewHolder(); 
      holder.tvCarName = (TextView) convertView.findViewById(R.id.tvCarName); 
      holder.tvDailyPriceValue = (TextView) convertView.findViewById(R.id.tvWeeklyPriceValue); 
      holder.tvWeeklyPriceValue = (TextView) convertView.findViewById(R.id.tvWeeklyPriceValue); 
      holder.imgCar = (ImageView) convertView.findViewById(R.id.imgCar); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.tvCarName.setText(car.getCarName()); 
     if (car.getImage() != null) { 
      holder.imgCar.setImageBitmap(car.getImage()); 
     } else { 
      // MY DEFAULT IMAGE 
      holder.imgCar.setImageResource(R.drawable.ic_action_call); 
     } 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView tvCarName; 
     TextView tvDailyPriceValue; 
     TextView tvWeeklyPriceValue; 
     ImageView imgCar; 
    } 

} 

回答

130

的唯一原因getView不叫有:

  1. getCount返回0.
  2. 你忘記撥打setAdapterListView
  3. 如果ListView的可見度(或其容器的可見度)爲GONE。感謝@TaynãBonaldo提供的寶貴意見。
  4. ListView未附加到任何視口布局。也就是說,使用mListView = new ListView(...)時沒有使用myLayout.addView(mListView)

onPostExcute,爲您打造CarListAdapter一個新的實例後,我會建議你更新的新實例您ListView。事實上,你需要再次調用

mList.setAdapter(adapter); 

編輯:setAdapter應該一直呼籲在UI線程上,以避免意外的行爲

EDIT2:

這同樣適用於RecyclerView。確保

  • getItemCount返回一個值刨絲器比0(通常是數據集大小)
  • setLayoutManagersetAdapter已對UI Thread
  • widget的知名度必須設置被稱爲VISIBLE
+0

它的工作,但你能解釋一下爲什麼,因爲在片段生命週期的onCreate()onCreateView()和IM調用的onCreate中的AsyncTask(前稱),並設置在onCreateView適配器( )之後被調用。 – Ravi 2013-05-02 12:51:06

+1

@Ravi首先,沒有人可以保證在調用onCreateView之前或之後完成AsyncTask擴展。這就是異步的意思。二,在onPostExcute你創建一個新的CarListAdapter和你的ListView必須被告知適配器已經改變 – Blackbelt 2013-05-02 12:55:29

+0

我的意思是通過在onPosExecute方法中設置適配器是這種類型的情況的好方法,或者有更好的體系結構來避免這種情況問題 – Ravi 2013-05-02 12:58:23

0

您在構造函數中缺少超類。見我下面的例子:

public AppDataAdapter(Activity a, int textViewResourceId, ArrayList<AppData> entries) { 
    super(a, textViewResourceId, entries); 
    this.entries = entries; 
    this.activity = a; 
} 
+0

我會補充一點: adapter = new CarListAdapter ...實際上並沒有爲視圖設置適配器。所以他有onCreateView和onPostExecute之間的競爭條件 – Raanan 2013-05-02 12:50:19

+0

你是對的,我沒有發現他沒有綁定新的適配器到列表視圖後執行。Blackbelt ftw – o0rebelious0o 2013-05-02 12:53:22

+0

@Raanan你可以詳細說明應該做些什麼來避免這種競爭條件,並解釋..我是新的android開發..如果你能解釋.. ..將是gr8 ..謝謝 – Ravi 2013-05-02 12:54:14

0

你一直在做的是

在您的適配器

public CarListAdapter(Context context , ArrayList<CarDetail> items) { 

    this.context = context; 
    this.items = items; 

} 

在片段

adapter = new CarListAdapter(getActivity(),ServiceCarListFragment.this.carDetailList); 

我希望你將使用FragmentActivity

你需要調用

adapter = new CarListAdapter(YOUR_ACTIVITY_CONTEXT, carDetailList); 

其中YOUR_ACTIVITY_CONTEXT將是你FragmentActivity

3

我面臨着類似的問題。這裏有一個簡單的解決方法:

在你的onCreateView中,你必須等待視圖被創建之前。因此,改變你的線條從這個:

mList = (ListView)v.findViewById(R.id.list); 
mList.setAdapter(adapter); 

更改上面的兩行:

mList = (ListView)v.findViewById(R.id.list); 
mList.post(new Runnable() { 
    public void run() { 
     mList.setAdapter(adapter); 
    } 
}); 

希望這將幫助其他人誰也碰到類似的問題

+0

我不明白這是如何幫助。 ASAIK,視圖在活動佈局被誇大時創建。我沒有看到任何需要進一步「等待」它的創作。我面臨着類似的問題,這不是一個解決方案。 – Bamaco 2015-03-26 22:00:30

4

您必須驗證列表有將項目添加到列表中時元素可能會有錯誤。 要驗證,使用方法:

adapter.getCount(); 
相關問題