2013-08-05 162 views
0

我正在一個項目中,我正在顯示一個車主列表。在訪問應用程序時,會顯示一個空列表。用戶搜索所有者,並顯示符合搜索條件的所有可用所有者。 我遇到的問題是所有者列表已更新,但它也顯示「沒有要顯示的記錄」,這是一個空列表應該顯示的內容。我在這裏錯過了什麼? 下面是相關的類對2013年8月6日 我更新了OwnerDetail類,並增加了asyncktask爲私有內部類自定義ListAdapter不更新

public class OwnerDetail extends ListFragment { 
    ListView mListView; 
    ArrayList<Owner> listItem = new ArrayList<Owner>(); 
    public OwnerAdapter ownerAdapter; 
    private String[] searchParameter = null; 

    public void SearchParameters(String[] parameters) 
    { 
     searchParameter = parameters; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     View v1 = inflater.inflate(R.layout.customize_layout,container, false); 
     mListView = (ListView) v1.findViewById(android.R.id.list); 
     return v1; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ownerAdapter = new OwnerAdapter(getActivity(), R.layout.owner_detail, listItem); 
     if(!(searchParameter == null)) 
     { 
      ownerAdapter.clear(); 
      ownerAdapter.addAll(listItem); 
      new OnwerAsyncTask().execute(); 
      ownerAdapter.notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     mListView.setAdapter(ownerAdapter); 
     ownerAdapter.notifyDataSetChanged(); 
    } 

    private class OnwerAsyncTask extends AsyncTask<Void, Void, List<Owner>> { 
     @Override 
     protected List<Owner> doInBackground(Void... params) { 
      try 
      { 
       Owner items = new Owner(); 
       items.setFirstName("John"); 
       items.setLastName("Smith"); 
       items.setCarId("1"); 
       listItem.add(items); 

       Owner item1 = new Owner(); 
       item1.setFirstName("Samantha"); 
       item1.setLastName("Right"); 
       item1.setCarId("2"); 
       listItem.add(item1); 

       Owner item2 = new Owner(); 
       item2.setFirstName("Regie"); 
       item2.setLastName("Miller"); 
       item2.setCarId("3"); 
       listItem.add(item2); 

       Owner item3 = new Owner(); 
       item3.setFirstName("Mark"); 
       item3.setLastName("Adam"); 
       item3.setCarId("4"); 
       listItem.add(item3); 


      } catch(Exception ex) 
      { 
       ex.toString(); 
      } 
      return listItem; 
     } 



     @Override 
     protected void onPreExecute() { 
      listItem.clear(); 
      ownerAdapter.clear(); 
      super.onPreExecute(); 
     } 



     @Override 
     protected void onPostExecute(List<Owner> result) { 
      /*OwnerDetail fragment = (OwnerDetail) mActivity.getSupportFragmentManager().findFragmentById(R.id.fOwnerDetail); 
      fragment.SetAdapter(result);*/ 
      super.onPostExecute(result); 
      if(listItem.size() > 0) 
      { 
       ownerAdapter.notifyDataSetChanged(); 
      } 
     } 
    } 
}  



public class OwnerAdapter extends ArrayAdapter<Owner> { 

    private Context context; 
    private int layoutResourceId; 
    private Owner data[] = null; 

    public OwnerAdapter(Context context, int textViewResourceId,Owner[] data) { 
     super(context, textViewResourceId, data); 
     this.context = context; 
     this.layoutResourceId = textViewResourceId; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     OwnerHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 
      holder = new OwnerHolder(); 
      holder.tvFName = (TextView) row.findViewById(R.id.tvFirstName); 
      holder.tvLName = (TextView) row.findViewById(R.id.tvLastName); 
      holder.tvCId = (TextView) row.findViewById(R.id.tvCarID); 
      row.setTag(holder); 
     } else 
     { 
      holder = (OwnerHolder) row.getTag(); 
     } 

     Owner item = data[position]; 
     holder.tvFName.setText(item.getFirstName()); 
     holder.tvLName.setText(item.getLastName()); 
     holder.tvCId.setText(item.getCarId()); 
     return row; 
    } 

    static class OwnerHolder 
    { 
     TextView tvFName; 
     TextView tvLName; 
     TextView tvCId; 
    } 
} 

編輯。它顯示了列表,但它也顯示「無記錄」。

owner_detail.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 


     <TextView 
      android:id="@+id/tvFirstName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="TextView" /> 

     <TextView 
      android:id="@+id/tvLastName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="TextView" /> 

     <TextView 
      android:id="@+id/tvCarID" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="TextView" /> 


</LinearLayout> 


// customize_layout.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@id/android:list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

    <TextView 
     android:id="@id/android:empty" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="invisible" 
     android:text="No record to be displayed." 
     /> 
</LinearLayout> 

回答

0

您不添加數據onPostExecute到適配器:

@Override 
    protected void onPostExecute(List<Owner> result) { 
      super.onPostExecute(result); 
      ownerAdapter.clear(); 
      ownerAdapter.addAll(result); 
      ownerAdapter.notifyDataSetChanged(); 
      Log.i("TESTING","Added " + result.size() + " items to adapter"); 
    } 

而且,我看你是使用自定義列表佈局,確保空的TextView有編號爲@android/id/empty,可見性設置爲gone

+0

我將其更改爲在onPostExecute中添加適配器,並將textview可見性設置爲消失,但仍未清除「沒有要顯示的記錄」。 @Override protected void onPostExecute(List result){ listItem =(ArrayList )result; super.onPostExecute(result); ()listItem.size()> 0) { ownerAdapter.notifyDataSetChanged(); }} – Gagouche

+0

@Gagouche放置一個日誌(請參閱更新的代碼答案),看看它是否在運行時顯示在logcat輸出中。如果不是,任務ID根本沒有完成。 –

+0

我編輯原始故事以添加自定義xml文件。它顯示添加到適配器的4個項目。我可以看到列表中的4個項目。但是,它也顯示「沒有要顯示的記錄」,它是空列表顯示的默認文本。 – Gagouche

0

你,因爲當你創建刷新適配器的片段ownernull等片段與空行初始化。

修改您的SetAdapter(Owner[] o)如下:

public void SetAdapter(Owner[] o) { 
    owner = o; 
    ownerAdapter.clear(); 
    ownerAdapter.addAll(o); 
    ownerAdapter.notifyDataSetChanged(); 
}