2012-07-07 144 views
0

我有一個ArrayAdapterArrayList填充。每次點擊其任何項目時,我都會重新填寫ArrayList並將notifyOnDataSetChange()發送到adapter。但對於我來說未知的原因,它在ArrayList範圍內的getView()方法中填充它的項目。我不明白爲什麼會發生這種情況。你們可以解釋getView() invokation的理論,所以我明白爲什麼會這樣。提前致謝!ArrayAdapter超出界限

這就是:

class MAdapter extends ArrayAdapter<String> { 
    public MAdapter(Context context, int textViewResourceId, List<String> objects) { 
     super(context, textViewResourceId, objects); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.file_explorer_row, null); 
    } else { 

    } 

     String txt = itemsList.get(position); // Out of bounds happens here 
     if (!txt.equals("")) { 
      TextView tt = (TextView) v.findViewById(R.id.file_explorer_tv_filename); 
      tt.setText(txt); 
     } 

    return v; 
} 

itemsList在外部類中聲明。

+0

這裏itemsList,你宣佈.. – 2012-07-07 11:48:45

+0

不是通過ArrayAdapter擴展適配器類,由BaseAdapter.implement擴展它的四種方法,包括在getCount將arrayList.size() ()函數並在剩下的兩個itemid函數中返回位置 – AkashG 2012-07-07 11:50:56

+0

R u再次填充整個ArrayList,或者只是將少量東西附加到列表中? – 2012-07-07 11:56:11

回答

0

雖然我沒有得到的你是什麼asking..i我假設,你再補充整個ArrayAdapter一個明確的說法....

那麼試試這個........ 。

使用removeView()上的ListView設置適配器之前...

如:

ListView.removeView(); 
ListView.setAdapter(yourAdapter); 
+1

它的工作原理,謝謝!但我使用'ListView.removeAllViewsInLayout();'。你知道答案爲什麼發生這種情況嗎? – Eugene 2012-07-07 12:10:22

+0

實際上,當你第一次啓動應用程序時,ListView是空的,然後你在其中添加數據(實際上它的視圖與數據內部)......當你嘗試第二次,再次沒有重新啓動應用程序,它會被追加到已經被填充的ListView中,現在當你嘗試訪問它時.. ArrayAdapter跳出界限,實際上它的ArrayList出界 – 2012-07-07 12:13:32

+0

聽起來像是一個真相,謝謝,你讓我的一天! – Eugene 2012-07-07 12:16:21

0

String txt = itemsList.get(position);
itemsList.get(position)返回一個整數值,你試圖存儲在一個字符串..這可能是原因。

+0

不,它返回String。 – Eugene 2012-07-07 11:53:41

1

改變這樣

public View getView(int position, View convertView, ViewGroup parent) {   
     View view = convertView; 
     if (view == null) 
     {    
      LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);   
      view = inflater.inflate(R.layout.file_explorer_row, parent, false); 
     }  
0

試試這個代碼:

class MAdapter extends BaseAdapter { 
    List<String> objects; 
    Context context; 
    public MAdapter(Context context,List<String> objects) { 
     super(); 
     this.context=context; 
     this.objects=objects; 
    } 



    public int getCount() { 
     return objects.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    Holder holder; 
    LayoutInflater vi; 
    if (v == null) { 
     holder=new Holder(); 
     vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.file_explorer_row, null); 
     holder.tt= (TextView) v.findViewById(R.id.file_explorer_tv_filename); 
     v.setTag(holder); 
    } else { 
     holder = (Holder) v.getTag(); 
    } 
     String txt = objects.get(position); // Out of bounds happens here 
     if (!txt.equals("")) { 
      holder.tt.setText(txt); 
     } 

    return v; 
} 

static class Holder{ 
    TextView tt; 
} 
}