2017-07-18 16 views
3

我這個問題掙扎了很長一段時間,我試圖用recyclerview來代替我的ListView和我的列表視圖看起來像這樣: -爲什麼findFirstVisibleItemPosition不能按預期工作?

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

在此列表視圖我返回第一個項目的位置爲零,因爲我給了頂部填充,所以它將只返回0,直到第一個項目超出屏幕界限。

但是,當我試圖用recyclerview做同樣的事情,即使第一個recyclerview項目是可見的,它仍然給我不同的第一個可見項目的值,這是因爲recyclerview認爲toppadding作爲屏幕綁定現在我沒有任何線索如何解決這個問題。 請幫忙。

這是我的代碼。

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

這完全是瘋狂的行爲是違反直覺的。你有沒有提到這是正確的行爲?它看起來像'android:clipToPadding =「false」'不符合'findFirstVisibleItemPosition()'。 – Cheticamp

+0

對不起,我沒有任何引用,但技術上這應該是這樣的情況下,如果第一個項目仍然可見,那麼爲什麼要跳轉到第二個android:clipToPadding =「false」在listview中很榮幸。可能b我應該發佈示例項目。 – George

回答

2

,直到找到一個更好的答案,你可以試試下面的代碼。 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; 
} 

我似乎記得大填充導致這些類型的滾動視圖問題。

+0

偉大的完美答案,如果接受,但我不得不知道如何處理它,如果它是gridlayoutmanager與兩列所有,因爲它是以這樣的順序返回我像0,2,4這顯然是真的所以我分爲位置/ 2但它幾乎完美,如果你有任何與gridlayoutmanger的解決方案也請更新。 – George

相關問題