2014-12-18 112 views
0

我已經搜索了這些論壇近3個小時,並看到幾個類似的問題,但沒有答案適合我。Listview數據模型已更新,但項目不顯示

我有一個活動,有幾個卡片視圖。其中一個卡片視圖具有帶字符串值和非常簡單的ListView的微調器。用戶從微調器中選擇1到12之間的值。然後,ListView應該根據微調器列表中的位置顯示與所選值相等的字符串數。例如,用戶選擇微調列表中的第二項,並且ListView顯示2個字符串。我有一個自定義適配器的列表視圖。 ListView本身最初顯示一行,這是正確的。但是,用戶從微調器中選擇一個值後,listview不顯示額外的行,它仍然只顯示一行。 ListView的數據來自ArrayList。在用戶選擇一個值並且它具有正確數量的條目後,我已經檢查了適配器的數據模型,就像ArrayList本身一樣,但無論我嘗試ListView本身仍然只顯示第一行。我試過NotifyDataSetChanged和Invalidate的每一個變種都沒有成功。

的各種代碼示例:

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
    if (parent == spDoseFrequency){ 
     Toast.makeText(this,String.valueOf(position),Toast.LENGTH_SHORT).show(); 
     rebuildReminderTimesList(position + 1); 
    } 
} 

private void rebuildReminderTimesList(int numberOfTimes){ 
    Toast.makeText(this,"yup",Toast.LENGTH_SHORT).show(); 
    //reset selected item to position 1 
    myApp.iSelectedReminderTimeIndex = 0; 

    //clear array and list, then rebuild with hourly timeslots 
    iarrTimes = new int[numberOfTimes][2]; 
    liReminderTimes.clear(); 
    int startTime = 8; 
    for (int i = 0; i < numberOfTimes; i++){ 
     iarrTimes[i][0] = startTime + i; 
     iarrTimes[i][1] = 0; 
     liReminderTimes.add(pad(startTime + i) + ":00"); 
    } 
    //refresh the listview 
    myAdapter.notifyDataSetChanged(); 
} 

public class ReminderListAdapter extends ArrayAdapter { 

List<String> liTimes; 
Context ctx; 
LayoutInflater inf; 

public ReminderListAdapter(Context ctx, List<String> liTimes) { 
    super(ctx, R.layout.reminder_time_listview, liTimes); 
    this.liTimes = liTimes; 
    this.ctx = ctx; 
    inf = LayoutInflater.from(ctx); 
} 

public void setLiTimes(List<String> liTimes){ 
    this.liTimes = liTimes; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View view = convertView; 
    ViewHolder viewHolder; 

    if (view == null){ 
     view = inf.inflate(R.layout.reminder_time_listview,parent,false); 
     viewHolder = new ViewHolder(); 
     viewHolder.sTime = (TextView) view.findViewById(R.id.tvTime); 
     view.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) view.getTag(); 
    } 

    viewHolder.sTime.setText(liTimes.get(position)); 
    return view; 
} 

private static class ViewHolder{ 
    TextView sTime; 
} 

}

任何幫助,將不勝感激,因爲這是推動我瘋了。

對此問題的快速更新:我剛剛測試了提供多個值的初始列表,但即使此時它只顯示第一個項目。在CardView對象內使用ListView可能有問題嗎?我所有其他的卡都能正常工作,只有ListView無法正常顯示。

此外,我已經嘗試修改代碼,以便不改變列表中元素的數量,它只是改變第一個元素的字符串中的文本,這工作正常。所以notifyDataSetChanged似乎正在工作,但它不會顯示多個項目。對Adapter.getCount()方法的快速檢查也會返回正確數量的元素,但不會顯示它們。

回答

0

我發現了這個問題。我在LinearLayout中有幾個CardView對象,它本身就在ScrollView中。只要我刪除了ScrollView,Card中的List就會正確顯示。這不幸的是又造成了另一個問題,就是我不能再滾動頁面來查看後面的卡片,我還沒有找到解決方案,但這是一個不同的話題。

1

很多人忘記撥打電話notifyDataSetChanged(),但你已經知道了。您是否使用自定義適配器?如果是這樣,這聽起來像是一個或多個適配器方法的問題。特別是,這聽起來像getCountgetView可能不會返回他們應該。這可能是因爲存在缺陷的邏輯問題,底層數據源未被正確更新,或底層數據源與您認爲的不同。儘管沒有看到你的適配器,但很難診斷。

+0

最初我嘗試使用簡單的標準適配器,而不是自定義的適配器,因爲它只需要顯示一個字符串。這具有相同的特徵。然後我使用自定義適配器重建它,但無濟於事。自定義適配器代碼現在添加到發佈。我也嘗試過首先擴展BaseAdapter,然後再擴展ArrayAdapter。 – SchonWieder