使用FirebaseListAdapter反转列表后,Item点击位置不匹配如何修复?
解决FirebaseListAdapter反转列表后点击位置与数据不匹配的问题
这个问题的核心原因很明确:你只通过重写getItem()实现了列表显示顺序的反转,但getRef()方法仍然使用原始的position去获取数据源节点,导致点击位置对应的数据库节点和当前显示的数据完全错位了。
两种修复方案,推荐第一种更优雅的实现方式:
方案1:重写FirebaseListAdapter的getRef()方法
既然已经通过getItem()反转了列表顺序,直接在Adapter中同步重写getRef(),让它和getItem()使用完全一致的位置转换逻辑,这样所有调用getRef()的地方都会自动适配反转后的列表,不用在外部重复处理:
@Override public Usuarios getItem(int position) { return super.getItem(getCount() - 1 - position); } // 新增重写getRef方法,和getItem保持一致的反转逻辑 @Override public DatabaseReference getRef(int position) { // 处理空列表的边界情况,避免数组越界异常 if (getCount() == 0) { return super.getRef(position); } return super.getRef(getCount() - 1 - position); }
修改完成后,你原有的点击事件代码完全不需要改动,mAdapter.getRef(position)和mAdapter.getItem(position)都会对应到正确的数据库节点和实体数据了。
方案2:在点击事件中手动转换position
如果不想修改Adapter的内部逻辑,也可以在点击事件里把ListView的点击position转换成数据源中的真实位置,再调用getRef():
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { // 将ListView的点击位置转换为数据源中的真实位置 int realDataSourcePosition = mAdapter.getCount() - 1 - position; mDatabase = mAdapter.getRef(realDataSourcePosition); Toast.makeText(MainActivity.this, ""+mDatabase.getKey(), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, UserEdit.class); intent.putExtra("uid",mDatabase.getKey()); // 注意:getItem仍然使用原始position,因为你的getItem已经处理了反转逻辑 intent.putExtra("Nombre", mAdapter.getItem(position).getNombre()); intent.putExtra("Email", mAdapter.getItem(position).getEmail()); intent.putExtra("Cars", mAdapter.getItem(position).getCars()); intent.putExtra("Planes", mAdapter.getItem(position).getPlanes()); intent.putExtra("Bus", mAdapter.getItem(position).getBus()); startActivity(intent); } });
额外提示
如果你的列表后续需要支持长按事件或者其他依赖position的操作,方案1会更省心——因为所有位置相关的逻辑都在Adapter内部统一处理了,不用在每个事件回调里重复编写转换代码。
内容的提问来源于stack exchange,提问作者Gastón Saillén
相关产品推荐
相关产品推荐

