2016-02-27 78 views
0

我有一种利用我创建了一个数据库类片段。我有一个名为populateListView()的方法,它使用CursorAdapter来填充ListView和数据。我的问题是,我不断收到一个语法错误,指出'CursorAdapter是抽象的,无法实例化'。在活动中使用此代码时我没有任何问题,但它不会在Fragment中工作。有人知道为什么吗?自定义的CursorAdapter在片段

这里是从我的片段的代码:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_contacts_fragments, container, false); 

    inputName = (EditText)view.findViewById(R.id.inputName); 
    inputNumber = (EditText)view.findViewById(R.id.inputNumber); 
    inputEmail = (EditText)view.findViewById(R.id.inputEmail); 
    saveButton = (Button)view.findViewById(R.id.saveButton); 
    deleteAllButton = (Button)view.findViewById(R.id.deleteAllButton); 
    openDB(); 
    populateListView(); 

    return view; 
} 

private void openDB(){ 
    myDB = new DBAdapter(getActivity()); 
    myDB.open(); 
} 

public void populateListView(){ 
    View view = getView(); 
    Cursor cursor = myDB.getAllRows(); 
    String[] fromFieldNames = new String[] {DBAdapter.KEY_NAME,DBAdapter.KEY_NUMBER,DBAdapter.KEY_EMAIL}; 
    int[] toViewIDs = new int[] {R.id.customRowContactName,R.id.customRowContactNumber,R.id.customRowRowEmail}; 

    CursorAdapter cursorAdapter; 
    //***SYNTAX ERROR WITH FOLLOWING LINE*** 
    cursorAdapter = new CursorAdapter(getActivity(),R.layout.contacts_custom_row,cursor,fromFieldNames,toViewIDs); 

    myList = (ListView)view.findViewById(R.id.listView); 
    myList.setAdapter(cursorAdapter); 
} 

回答

2

CursorAdapter是一个抽象类,这意味着它不能被实例化。

在你的活动你可能使用SimpleCursorAdapter因为你的构造函数的参数匹配什么要求,或者您可能使用自己的实施CursorAdapter的。

其中任何一种都可以在Fragment中工作,前提是它已经在您使用的Activity中工作。

cursorAdapter = new SimpleCursorAdapter(getActivity(), R.layout.contacts_custom_row, 
             cursor, fromFieldNames, toViewIDs); 
+0

是的,所以SimpleCursorAdapter确实工作,但Android是告诉我,它弃用.... SimpleCursorAdapter的CursorAdapter =新SimpleCursorAdapter(getActivity(),R.layout.contacts_custom_row,光标,fromFieldNames,toViewIDs); .. ..你知道应该用什么来代替吗? –

+0

是的。该方法的文档实际上提到了,为什么你不应该再使用它,而是要使用http://developer.android.com/intl/es/reference/android/widget/SimpleCursorAdapter.html#SimpleCursorAdapter(android.content.Context什么,int,android.database.Cursor,java.lang.String [],int []))。基本上使用'LoaderManager'用'CursorLoader'以确保执行查询关闭UI线程和更新后的任何查询关闭UI线程完成了。 –

+0

如果您已经加载数据从UI线程还有另外一个重载的构造函数的标志。如果您不希望它在数据更新时自动重新查询,则可以使用它。 '的CursorAdapter =新SimpleCursorAdapter(getActivity(),R.layout.contacts_custom_row, 光标,fromFieldNames,toViewIDs,0);' –