【问题标题】:ListView itemId is always 0ListView itemId 始终为 0
【发布时间】:2017-02-24 10:35:21
【问题描述】:

setOnItemClickListener的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();
    }
}
}

适配器代码:

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

【问题讨论】:

  • 因为您的 ContentProvider 为 _id 列返回 0...或者您在适配器实现中覆盖了 getItemId ...但这只是一个盲目的猜测,因为您没有提供最重要的代码...跨度>

标签: java android listview android-cursoradapter


【解决方案1】:

你正在做新的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 查看游标中的数据本身

【讨论】:

  • 是的,您正在按照我的预期扩展 Cursor 适配器,所以这应该可以,只需将该方法添加到 ListAdapter 中(顺便说一下,将具体类命名为与接口相同是个坏主意。您的 IDE 应该发出警告你)
  • 不,它没有解决错误仍然返回的值为零
  • 您确定 TableName.table1.mId 是正确的列并且还注销了 getLong 返回的内容,以及 moveToPosition 是否成功?
  • 完成仍为零
  • 好吧,如果它确实调用了getLong(即moveToPosition 成功)并且返回0,那么问题出在数据中。试试我刚刚在上面添加的日志,看看你有什么
猜你喜欢
  • 2023-03-10
  • 2014-01-09
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
相关资源
最近更新 更多