7

CursorLoader를 만들 때 "swapCursor (Cursor) is undefined"오류가 발생합니다. android.support.v4 (app.LoaderManager, app.LoaderManager.Loader, Content.CursorLoader, content.Loader)를 가져 왔습니다. 이 문제를 해결하기 위해 내가 무엇을 할 수 있는지 잘 모릅니다. 제발 조언.swapCursor 정의되지 않은 오류

로더 : 당신의 onCreate() 방법에서

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.CursorLoader; 
import android.support.v4.content.Loader; 
import android.support.v4.app.ListFragment; 
import android.support.v4.widget.CursorAdapter; 



public class LoginList extends FragmentActivity implements OnClickListener, 
AdapterView.OnItemClickListener, LoaderManager.LoaderCallbacks<Cursor> { 

    private ListView loginList; 
    private Button webLogin; 
    private SimpleCursorAdapter adapter; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login_listview); 

     loginList = (ListView)findViewById(R.id.loginlist); 
     loginList.setOnItemClickListener(this); 

     webLogin = (Button)findViewById(R.id.button3); 
     webLogin.setOnClickListener(this); 



     //Specify fileds to display in the list 
     String[] from = new String[] { ListProvider.COLUMN_NAME_SITE }; 

     //Bind fields to listview 
     int[] to = new int[] {R.id.loginlist}; 

     // Create CursorAdapter and set it to display 
     adapter = new SimpleCursorAdapter(this, R.layout.login_listview, null, from, to); 

     loginList.setAdapter(adapter); 

     getSupportLoaderManager().initLoader(0, null, this); 
    } 

    /*@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 

    super.onViewCreated(view, savedInstanceState); 
    setEmptyText(getResources().getString(string.app_name)); 
    rwgisterForContextMenu(getListView()); 
    setHasOptionsMenu(true); 
     } */ 


    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 

     Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show(); 

     Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class); 


     Cursor clickedObject = (Cursor)loginList.getItemAtPosition(arg2); 

     Bundle loginBundle = new Bundle(); 
     loginBundle.putString("clickedWebSite",((LoginDetails) clickedObject).getsName()); 
     loginBundle.putString("clickedWebAddress",((LoginDetails) clickedObject).getwUrl()); 
     loginBundle.putString("clickedUserName",((LoginDetails) clickedObject).getuName()); 
     loginBundle.putString("clickedPassWord",((LoginDetails) clickedObject).getpWord()); 
     loginBundle.putString("clickedNotes",((LoginDetails) clickedObject).getlNotes()); 

     updateDeleteLoginInfo.putExtras(loginBundle); 

     startActivityForResult(updateDeleteLoginInfo, 0); 
    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     Intent webLoginIntent = new Intent (this, LoginPlusActivity.class); 
     startActivity(webLoginIntent); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int ignored, final Bundle args) { 
     return new CursorLoader(this, ListProvider.CONTENT_URI, null, null, null, null); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     adapter.swapCursor(cursor); /* swapCursor error: The method swapCursor(Cursor) is undefined for the type SimpleCursorAdapter */ 


    } 

    @Override 
    public void onLoaderReset (Loader<Cursor> loader) { 
     adapter.swapCursor(null); /* swapCursor error: The method swapCursor(Cursor) is undefined for the type SimpleCursorAdapter */ 

    } 
} 
+2

당신이'수입 android.support.v4.widget.CursorAdapter'가 아닌'android.widget.CursorAdapter' –

+0

@vmironov 수입하지만 에러 증설 아마 아직도 말을 의미 – user1165694

+0

무엇 vmironov exsist있다을 사용하는 것입니다 'android.widget.SimpleCursorAdapter' 대신'android.support.v4.widget.SimpleCursorAdapter'를 사용하십시오. 다른 방법으로'changeCursor'는 모든 릴리즈에서 사용할 수 있지만 이전 커서를 닫는 단점이 있습니다 (로더 코드가 실패 할 수 있습니다) – Delyan

답변

0

당신은 당신의 어댑터가 두 번째 인수로 ListView을 통과 초기화합니다. 이것은 잘못된 것입니다, 그것은 레이아웃의 ID가 목록의 각 항목에 대한 인스턴스를 생성해야한다 :

코드가 나에게 잘 보이는 것이 이상
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, from, to); 

기타. UI를 인스턴스화하지 않고 onActivityCreated(Bundle) 메서드를 재정의하기 위해 ListFragment를 사용하는 작업 코드와 비교했습니다.

ContentProvider으로 데이터베이스에서 추출한 데이터의 양을 줄이려면 문제가 발생했지만 null을 전달하면 문제가되지 않습니다.

그러나 "_id"기본 키 열을 ContentProvier에서 길게 제공하는지 확인하십시오. ListView (및 다른 위젯 중 일부)을 사용하려면 Long 기반 기본 키가 있어야합니다.이 기본 키는 기본 키로 이미 완벽하게 수용 가능한 UUID를 가지고 있기 때문에 실제로 불편했습니다.

2

changeCursor()를 swapCursor() 대신 LoaderManager.LoaderCallbacks와 함께 사용하는 방법에 대한 예제입니다.

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return new CursorLoader(this, DB_table.CONTENT_URI, DB_table.PROJECTION,null,null,null); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.changeCursor(data); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    mAdapter.changeCursor(null); 
} 

나이가 API의의에 대한 API (11)에서 사용할 수있는 swapCursor()를 사용하려는 경우, 지원 라이브러리에서 CursorAdapter를 가져올 기억한다.

import android.support.v4.widget.CursorAdapter;