2017-02-24 2 views
-3

Der Wert von id-Parameter von setOnItemClickListener zurückgegeben wird, ist immer 0 (Null) unabhängig davon, welche Position i auf den Wert klicken immer wieder istListview itemId ist immer 0

aber der Wert der Position der korrekten und ich habe auch versucht, adapterView.getItemIdAtPosition(i) und immer noch der Wert für jedes Element in der Liste klicken, ist Null

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

mit weil Ihr ContentProvider 0 für _id column zurückgibt ... oder Sie überschreiben getItemId in Ihrer Adapterimplementierung ... aber es ist nur eine blinde Schätzung, da Sie den wichtigsten Code nicht bereitgestellt haben ... – Selvin

Antwort

0

Sie tun neue ListAdapter(getActivity(),null);, die eine benutzerdefinierte Klasse ist, da Sie dies mit einer Schnittstelle nicht tun können. Haben Sie die Standardmethode getItemId aktualisiert? Ich würde nicht spielen.

Aus der Spitze von meinem Kopf, Ihr Adapter eine Implementierung ähnlich müssen:

@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; 
} 

Wenn Sie das Problem zu sehen, die Daten nicht lösen können sich in Ihrem Cursor DatabaseUtils

+0

Ich habe den Beitrag mit dem Adaptercode – Nsnik

+0

aktualisiert Ja, du verlängerst den Cursor-Adapter wie erwartet, also sollte das funktionieren, füge einfach hinzu Methode in ListAdapter (es ist eine schlechte Idee, eine konkrete Klasse genauso zu benennen wie eine Schnittstelle btw. Ihre IDE sollte Sie warnen) –

+0

Nein, es hat den Fehler nicht gelöst immer noch der zurückgegebene Wert ist – Nsnik