2012-11-08 48 views
0

所以我有一個基礎適配器類,我建立。我也嘗試在我的一項活動中使用它。我有一個用於父佈局的xml和用於膨脹的行的xml。但是,這些組件不能鏈接在一起。該應用程序不會崩潰,但行不膨脹(儘管母版xml文件仍顯示在屏幕上)。可以看看我的代碼並告訴我我忽略了哪些關鍵組件?我只會發布相關的代碼。無法發佈錯誤日誌,因爲沒有發生錯誤。非常感謝BaseAdapter not populating listview

父XML(nearby_places_list)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="10dp" 
    android:orientation="vertical" 
    android:background="@drawable/bg"> 

    <Button 
    android:id="@+id/continuetomap" 
    android:layout_height="100dp" 
    android:layout_width="match_parent" 
    android:background="@drawable/map_continue" 
    /> 

    <ListView 
     android:id="@+id/list_view_nearby" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:divider="#b5b5b5" 
     android:listSelector="@drawable/list_selector"> 
    </ListView> 


</LinearLayout> 

行膨脹XML(nearby_list_row)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="5dp" 
     android:orientation="vertical" 
     android:background="@drawable/list_selector">" 

     <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:background="@drawable/list_selector"> 

      <LinearLayout 
      android:layout_width="0dp" 
      android:layout_weight="3" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:background="@drawable/list_selector"> 
       <TextView 
        android:id= "@+id/name"   
        android:textSize="20dp" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="name" 
        android:textColor="#54944d"/> 
       <TextView 
        android:id= "@+id/vicinity"   
        android:textSize="20dp" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="vicinity" 
        android:textColor="#000000"/> 
        <TextView 
        android:id= "@+id/openorclosed" 
        android:textSize="20dp" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Open" 
        android:textColor="#000000" 
        android:textStyle="bold"/>  
        </LinearLayout> 


      <RelativeLayout 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="0.74" > 

       <Button 
       android:layout_width="60dp" 
       android:id="@+id/button_add_to_fav" 
       android:background="@drawable/add_square" 
       android:layout_height="60dp" 
       android:layout_alignParentRight="true" 
       /> 

       <Button 
       android:layout_width="60dp" 
       android:id="@+id/button_call_rest" 
       android:background="@drawable/add_square" 
       android:layout_height="60dp" 
       android:layout_alignParentRight="true" 
       android:layout_below="@+id/button_add_to_fav" 
       /> 

      </RelativeLayout> 

      </LinearLayout> 


    </RelativeLayout> 

底座適配器類

public class AdapterForList extends BaseAdapter { 

    private final Context context; 
    private final ArrayList<HashMap<String, String>> alHm; 
    private final String TAG_A; 
    private final String TAG_B; 
    private final String TAG_C; 


    public AdapterForList(Context context, ArrayList<HashMap<String, String>> alhm, String TAG_1, String TAG_2, String TAG_3) { 
     super(); 
     this.context = context; 
     this.alHm = alhm; 
     TAG_A = TAG_1; 
     TAG_B = TAG_2; 
     TAG_C = TAG_3; 
    } 

    @Override 
    public View getView(int position, View convertView , ViewGroup parent){ 
     LayoutInflater inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     convertView = inflator.inflate(R.layout.nearby_list_row, parent, false); 
     TextView tv1 = (TextView) convertView.findViewById(R.id.name); 
     TextView tv2 = (TextView) convertView.findViewById(R.id.vicinity); 
     TextView tv3 = (TextView) convertView.findViewById(R.id.openorclosed); 
     Button btnAdd= (Button) convertView.findViewById(R.id.button_add_to_fav); 
     Button btnCall= (Button) convertView.findViewById(R.id.button_call_rest); 

     if (alHm.get(position).containsKey(TAG_A)){ // get the value from the key (if it exist) and set the first text view to it 
      String value = alHm.get(position).get(TAG_A); 
      tv1.setText(value);; 
     } 

     if (alHm.get(position).containsKey(TAG_B)){ 
      String value = alHm.get(position).get(TAG_B); 
      tv2.setText(value);; 
     } 

     if (alHm.get(position).containsKey(TAG_C)){ // get the value from the key (if it exist) and set the first text view to it 
      String value = alHm.get(position).get(TAG_C); 
      tv3.setText(value);; 
     } 

     return convertView; 
    } 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return alHm.size(); 
    } 
    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 
    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

} 

相關活動代碼

protected void onPostExecute(Boolean result){ 
    if (result){ 
     // adding data to listview 
     final ListView lv = (ListView) findViewById(R.id.list_view_nearby); 
     lv.setAdapter(new AdapterForList(context, listOfHM, JSONextractor.TAG_NAME, 
      JSONextractor.TAG_VICINITY, JSONextractor.TAG_OPERATINGHOURS_OPENNOW)); 

     //more code ... 

    } 
} 
+0

你在AdapterForList構造記錄的alhm的ArrayList大小試過嗎?因爲如果是空的多數民衆贊成在問題... – sabadow

+0

阿爾姆有正確的計數爲20,其中的值是正確的。正確的listview也被找到 –

+0

WTF?!?!它現在工作正常。我還沒有改變一行代碼。我已經運行這個並在調試器中多次遍歷這個 –

回答

0

因此,事實證明我的代碼確實工作(但不是最佳)。我在下面發佈如何正確使用基礎適配器

剛剛閱讀由savadow構成的文章(真正打開我的想法)。基本上,我有我的BaseAdapter我沒有利用任何類的優化能力。相反,我會將代碼更改爲基本適配器類中的以下內容。

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

public View getView(int position, View convertView , ViewGroup parent){ 
     LayoutInflater inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null){ 
     convertView = inflator.inflate(R.layout.nearby_list_row, parent, false); 
     } 
     // now if the convertView is not null i simply update the values rather than re-inflate the view (inflating is expensive) 

     tv1 = (TextView) convertView.findViewById(R.id.name); 
     tv2 = (TextView) convertView.findViewById(R.id.vicinity); 
     tv3 = (TextView) convertView.findViewById(R.id.openorclosed); 
     btnAdd= (Button) convertView.findViewById(R.id.button_add_to_fav); 
     btnCall= (Button) convertView.findViewById(R.id.button_call_rest);