ArrayAdapter为ListView中的每个项目重复UI标题

问题描述:

我在显示UI中的项目列表时遇到问题。ArrayAdapter为ListView中的每个项目重复UI标题

我的UI布局页面布局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ListOfRecordsContainer" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#454545" 
    android:orientation="vertical" > 

    <include 
     android:layout_weight="1" 
     layout="@layout/header" /> 

    <TextView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/ListOfRecords" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="0.01" 
     android:padding="1dp" 
     android:textSize="12sp" > 
    </TextView> 

</LinearLayout> 

在类,一旦列表是从一个远程系统中检索并填充在UI中TextViewonSuccess()方法被调用。

但是,布局中包含的标题部分正针对每条记录重复。我在这里错过了什么?

例如....实际结果是

<Header Button for LogOut> 
Item1 
<Header Button for LogOut> 
Item2 

预期的结果是

<Header Button for LogOut> 
Item1 
Item2 

代码如下所示:


public class ItemMainPage extends ListActivity{ 

    private String[] AccountName; 
    private String[] AccountIds; 
    private RestClient client; 
    private String apiVersion; 

    LinearLayout layout; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ListView lv = getListView(); 
     apiVersion = getString(R.string.api_version); 

     lv.setTextFilterEnabled(true); 

     /*layout = (LinearLayout) View.inflate(this, R.layout.list_item_main_page, null); 
     Button buyButton = new Button(this); 
     buyButton.setText("Search"); 
     layout.addView(buyButton);*/ 


    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 

     // Login options 
     String accountType = getString(R.string.account_type); 
     LoginOptions loginOptions = new LoginOptions(
       null, // gets overridden by LoginActivity based on server picked by uuser 
       ForceApp.APP.getPasscodeHash(), 
       getString(R.string.oauth_callback_url), 
       getString(R.string.oauth_client_id), 
       new String[] {"api"}); 

     new ClientManager(this, accountType, loginOptions).getRestClient(this, new RestClientCallback() { 
      //@Override 
      public void authenticatedRestClient(RestClient client) { 
       if (client == null) { 
        ForceApp.APP.logout(ItemMainPage.this); 
        return; 
       } 
       ItemMainPage.this.client = client; 
       getAccountList(); 
      } 
     }); 
     EventsObservable.get().notifyEvent(EventType.RenditionComplete); 
    } 

    private void getAccountList(){ 

     try { 

      String soql = "select id, name from Account LIMIT 2"; 
      RestRequest request = RestRequest.getRequestForQuery(apiVersion, soql); 

      client.sendAsync(request, new AsyncRequestCallback() { 

       //@Override 
       public void onSuccess(RestRequest request, RestResponse response) { 
        try { 
         if (response == null || response.asJSONObject() == null) 
          return; 

         JSONArray records = response.asJSONObject().getJSONArray("records"); 

         if (records.length() == 0) 
          return; 

         AccountName = new String[records.length()]; 
         AccountIds = new String[records.length()]; 

         for (int i = 0; i < records.length(); i++){ 
          JSONObject Account = (JSONObject)records.get(i); 
          AccountName[i] = Account.getString("Name"); 
          AccountIds[i] = Account.getString("Id"); 
         } 
         //ArrayAdapter<String> ad = new ArrayAdapter<String>(ItemMainPage.this, 
         //             R.layout.list_item_main_page, 
         //             AccountName); 
         ArrayAdapter<String> ad = new ArrayAdapter<String>(ItemMainPage.this, R.layout.list_item_main_page, R.id.ListOfRecords, AccountName); 
         setListAdapter(ad); 
         Log.d("Adapter", ad.toString()); 
         //EventsObservable.get().notifyEvent(EventType.RenditionComplete); 
        } catch (Exception e) { 
         e.printStackTrace(); 
         displayError(e.getMessage()); 
        } 
       } 

       //@Override 
       public void onError(Exception exception) { 
        displayError(exception.getMessage()); 
        EventsObservable.get().notifyEvent(EventType.RenditionComplete); 
       } 
      }); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      displayError(e.getMessage()); 
     } 
    } 


    private void displayError(String error) { 
     //ArrayAdapter<String> ad = new ArrayAdapter<String>( AccountList.this, R.layout.list_item, new String[]{"Error retrieving Account data - " + error}); 
     //setListAdapter(ad); 
     ((TextView) findViewById(R.id.welcome_text)).setText(getString(R.string.welcome, client.getClientInfo().username)); 

    } 

} 

如果我请大家帮忙丢失了一切。

我猜您提供的XML被用作行布局,这意味着:

<include 
    android:layout_weight="1" 
    layout="@layout/header" /> 

包括每一行(就像你所看到的)英寸

如果你想一个标题添加到您的ListView尝试:

View header = getLayoutInflater().inflate(R.layout.header, null); 
listView.addHeaderView(header); 

并从该行布局include元素。

+0

非常感谢。该解决方案的工作原理,但是说,我需要在列表上方有一个搜索栏来搜索列表中的项目,并且单独为列表寻找一个头......这怎么可能? – user1543211 2012-07-23 11:58:51

+0

有很多方法可以做到这一点,事实上,这里是关于这个主题的完整的[Android Developer Article](http://developer.android.com/guide/topics/search/search-dialog.html)。如果您需要特殊帮助,请不要犹豫,提出一个新问题,提供您在此处所做的尽可能详细的信息。 – Sam 2012-07-23 16:57:32

+0

当然,谢谢吨。非常感激。 – user1543211 2012-07-24 15:14:59

使您的标题为单独的XML布局,并使用addHeaderView添加到您的列表视图。 IE:

View header = (View)getActivity().getLayoutInflater().inflate(R.layout.listview_header_row, null); 
    lv.addHeaderView(header); 

希望这有助于!

+0

非常感谢。该解决方案的工作原理,但是说,我需要在列表上方有一个搜索栏来搜索列表中的项目,并且单独为列表寻找一个头......这怎么可能? – user1543211 2012-07-23 12:00:14