2017-02-24 4 views
-3

setOnItemClickListener의 id 매개 변수에 의해 반환되는 값에 상관없이 내가 반환 된 값을 클릭하는 위치에 항상 0의 ListView는 항목 ID 항상 0

하지만 정확한 위치의 값입니다 항상 0 (영)입니다 그리고 나 또한 adapterView.getItemIdAtPosition(i)을 시도하고 여전히 목록의 각 항목을 클릭에 값이 제로

public class ListFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>{ 

ListView onlineList; 
FloatingActionButton onlineListFab; 
private static final int mLoaderId = 1; 
ListAdapter listAdapter; 

public ListFragment() { 

} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_list, container, false); 
    initilize(v); 
    return v; 
} 

private void initilize(View v) { 
    onlineList = (ListView)v.findViewById(R.id.onlineList); 
    onlineListFab = (FloatingActionButton)v.findViewById(R.id.onlineListFab); 
    onlineListFab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      startActivity(new Intent(getActivity(),AddItem.class)); 
     } 
    }); 
    listAdapter = new ListAdapter(getActivity(),null); 
    onlineList.setAdapter(listAdapter); 
    onlineList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      Intent details = new Intent(getActivity(),AddItem.class); 
      details.setData(Uri.withAppendedPath(TableName.mContentUri,String.valueOf(l))); 
      Toast.makeText(getActivity(),l+"",Toast.LENGTH_SHORT).show(); 
      //startActivity(details); 
     } 
    }); 
    loadItems(); 
} 

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    switch (id){ 
     case mLoaderId: 
      return new CursorLoader(getContext(), TableName.mContentUri,null,null,null,null); 
    } 
    return null; 
} 

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

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

private void loadItems() { 
    if (getActivity().getSupportLoaderManager().getLoader(mLoaderId) == null) { 
     getActivity().getSupportLoaderManager().initLoader(mLoaderId, null, this).forceLoad(); 
    } else { 
     getActivity().getSupportLoaderManager().restartLoader(mLoaderId, null, this).forceLoad(); 
    } 
} 
} 

AdapterCode입니다 :

public class ListAdapter extends CursorAdapter{ 


public ListAdapter(Context context, Cursor c) { 
    super(context, c); 
} 


@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    View v = LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false); 
    return v; 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView name,price; 
    name = (TextView)view.findViewById(R.id.itemName); 
    price = (TextView)view.findViewById(R.id.itemPrice); 
    name.setText(cursor.getString(cursor.getColumnIndex(TableName.table1.mName))); 
    price.setText(String.valueOf(cursor.getInt(cursor.getColumnIndex(TableName.table1.mPrice)))); 
} 
} 
+0

ContentProvider가 _id 열에 대해 0을 반환했기 때문에 또는 어댑터 구현에서 getItemId를 재정의 했으므로 ... 가장 중요한 코드를 제공하지 않았으므로 눈먼 추측 일뿐입니다. – Selvin

답변

0

새로운 인터페이스를 사용하면 사용자 정의 클래스 인 ListAdapter(getActivity(),null);을 보았습니다. 기본 getItemId 메소드를 업데이트 했습니까? 나는 도박을하지 않을 것입니다. 내 머리 위로 떨어져

, 당신의 어댑터는 유사한 구현해야합니다 : 당신은 문제가 사용하여 커서에서 데이터 자체를 살펴 해결할 수없는 경우

@Override 
public long getItemId(int position) { 
    long result = 0; 
    if (mCursor.moveToPosition(position)) { 
     Log.d("SO", DatabaseUtils.dumpCurrentRowToString(mCursor); 
     result = mCursor.getLong(mCursor.getColumnIndex(TableName.table1.mId)); 
    } 
    return result; 
} 

DatabaseUtils

+0

어댑터 코드 – Nsnik

+0

으로 게시물을 업데이트했습니다. 예, 예상대로 커서 어댑터를 확장하고 있으므로이 기능이 작동합니다. 그냥 추가하십시오. 메서드를 ListAdapter에 추가합니다 (구체적인 클래스를 인터페이스 btw와 동일한 이름으로 지정하는 것은 좋지 않습니다. IDE에서 경고해야 함) –

+0

아니요 오류가 해결되지 않았으므로 반환 된 값은 0입니다. – Nsnik