我在这个问题上苦苦挣扎了很长时间,我试图用 recyclerview 替换我的 ListView ,我的 ListView 看起来像这样:-
<ListView
android:id="@+id/browser_sub_list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true"
android:clipToPadding="false"
android:drawSelectorOnTop="true"
android:paddingTop="340dp"/>
现在当我打电话的时候
view.getFirstVisiblePosition();
在这个 ListView 上,我返回第一个项目的位置,它是零,因为我已经给了顶部填充,所以它会一直只返回零,直到第一个项目超出屏幕范围。
但是当我尝试用 recyclerview 做同样的事情时,即使 recyclerview 的第一项仍然可见,它仍然给我 firstvisible item 的不同值,这是因为 recyclerview 认为 toppadding 是屏幕绑定(bind),现在我没有任何线索如何解决这个问题。 请帮忙。
这是我的代码。
MainActivity.Java
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private TheAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
ArrayList<String> items = new ArrayList<>();
for (int i = 0; i < 300; i++) {
items.add("This is item:-" + i);
}
adapter = new TheAdapter(items);
mRecyclerView.setAdapter(adapter);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
Log.d("DISTANCE", "" + linearLayoutManager.findFirstVisibleItemPosition());
}
});
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:clipToPadding="false"
android:paddingTop="340dp"
android:layout_height="match_parent"
/>
</RelativeLayout>
这是我的适配器类
class TheAdapter extends RecyclerView.Adapter<TheAdapter.ItemHolder> {
public TheAdapter(ArrayList<String> data) {
mData = data;
}
private ArrayList<String> mData;
@Override
public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new ItemHolder(view);
}
@Override
public void onBindViewHolder(ItemHolder holder, int position) {
holder.mTextView.setText(mData.get(position));
}
@Override
public int getItemCount() {
return mData == null ? 0 : mData.size();
}
public class ItemHolder extends RecyclerView.ViewHolder {
private TextView mTextView;
public ItemHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.textTitle);
}
}
}
最佳答案
在找到更好的答案之前,您可以尝试以下代码。 int pos
是 findFirstVisibleItemPosition()
报告的位置。此方法将返回 RecyclerView
中最顶部的可见位置。
public int findRealFirstVisibleItemPosition(int pos) {
View view;
final LinearLayoutManager linearLayoutManager =
(LinearLayoutManager) mRecyclerView.getLayoutManager();
while (pos > 0) {
view = linearLayoutManager.findViewByPosition(pos - 1);
if (view == null) {
break;
}
pos = pos - 1;
}
return pos;
}
我似乎记得大填充会导致此类 ScrollView 问题。
关于android - 为什么 findFirstVisibleItemPosition 不能按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45172710/