簡體   English   中英

如何獲取當前在回收站視圖的線性布局中不可見的視圖

[英]How to get the views which are not visible currently in the linear layout of the recycler view

我正在設計一個 Instagram 故事類型模板。 我陷入了一個非常奇怪的問題。 我在主要活動中使用了回收站視圖。

MainActivity:(這只是顯示的布局。我已將方向更改為水平)。

在此處輸入圖像描述

我的布局:

在此處輸入圖像描述

然后我設計了一個自定義適配器,並在布局中使用了線性布局。 單擊每個視圖時,它會打開一個顯示整個故事內容的新活動。

就像在 Instagram 中,當用戶打開任何故事時,用戶可以點擊屏幕右側進入下一個故事,或者點擊屏幕左側進入上一個故事。 我試圖實現同樣的功能。 開啟劇情成功實施。 當我在屏幕上添加右擊和左擊的功能時,問題就來了。 我添加了兩個按鈕; 一個在右邊,一個在左邊。 問題是,如果當前有 3 個視圖可見,那么我只能在這些故事之間導航,而不能導航到由於回收站視圖而在屏幕上不可見的故事。

下面的代碼用於左右點擊

leftArrow = findViewById(R.id.leftArrow);
    leftArrow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(myAdapter.currentPosition - 1 >= 0) {
                int firstVis = MainActivity.linearLayoutManager.findFirstVisibleItemPosition();
                MainActivity.linearLayoutManager.scrollToPosition(firstVis - 1);
                rightOrLeftClicks(myAdapter.currentPosition - 1);
            }
        }
    });

    rightArrow = findViewById(R.id.rightArrow);
    rightArrow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(myAdapter.currentPosition + 1 < myAdapter.localDataSet.length) {
                int lastVis = MainActivity.linearLayoutManager.findLastVisibleItemPosition();
                MainActivity.linearLayoutManager.scrollToPosition(lastVis + 1);
                rightOrLeftClicks(myAdapter.currentPosition + 1);
            }
        }
    });
}

下面的代碼是 function rightOrLeftClicks

public void rightOrLeftClicks(int position) {
    finish();
    Log.d("rl", "working");
    nextView = MainActivity.linearLayoutManager.getChildAt(position);
    Log.d("ll", "The last element is " + MainActivity.linearLayoutManager.findLastVisibleItemPosition());
    if(nextView != null)myAdapter.onClickView(position, myAdapter.localDataSet[position].symptom, nextView);
}

下面的代碼用於onClickView ,它與單擊任何視圖(故事)或單擊左右按鈕的代碼相同。 基本上,我只是通過傳遞一個意圖來打開另一個活動,其中包含我分別單擊右側或左側時獲得的下一個或上一個視圖。

public static void onClickView(int position, String element, View v) {
    Intent intent = new Intent(v.getContext(), MainActivity2.class);
    idPosition = "";
    idPosition = element;
    ArrayList<String> passingContent = new ArrayList<>();
    currentPosition = position;
    passingContent.add(localDataSet[position].description);
    passingContent.add(localDataSet[position].imageUrl);
    intent.putExtra(element + "", passingContent);
    v.getContext().startActivity(intent);
}

問題是它只給我可見的視圖。 不是rest的意見。 我嘗試了自動滾動,以便下一個或上一個視圖變得可見,但它似乎不起作用。 孩子的最后一個可見 position 保持不變,當我嘗試在最后一個可見視圖之后打開視圖時,它返回一個 null 視圖給我。

在此處輸入圖像描述

假設有 5 個故事。 然后我將在屏幕上只看到 3 個故事,通過滾動可以看到 rest。 當我點擊任何故事時。 我只能在 1,2 和 3 之間導航。當我嘗試從故事 3 中單擊以查看故事 4 時。當前故事被finish() function 和nullnextView變量中返回,因此故事 4未加載,我返回到 MainActivity。

我必須導航到我的回收站視圖中存在的所有故事。

做這些改變可能會有所幫助:

1/我認為你應該使用ViewPager 它會自動捕捉到沒有 scrollTo 索引的項目。 或者在SnapHelper的幫助下繼續使用RecyclerView

2/修改onClickView方法不是static,不需要View v工作。 我看到你只需要View v就可以了。 為什么不直接將context傳遞給該方法。 使用這樣的參數是不合適的,這種方法會使您陷入 3/ 問題。

3/

nextView = MainActivity.linearLayoutManager.getChildAt(position);

你已經知道 RecyclerView 是如何工作的,只是避免使用getChildAt因為在某些情況下,你想要的孩子還沒有被創建。 根據您的代碼,我認為您甚至不需要獲取nextView

正如 Tam Huynh 所說。 第一點幫助我在線性布局中獲得新視圖。 這些意見運作良好。

function getChildAt的參數有問題。 我必須通過與之前相同的 position。 因為子視圖的位置(索引)相對不會改變。

索引 0 -> 故事編號 1

索引 1 -> 故事編號 2

索引 2 -> 故事編號 3

就像如果有 1,2 和 3 層可見,索引 0 將包含第 1 層,索引 1 將包含第 2 層,索引 2 將包含第 3 層。 當用戶單擊第三個故事的右鍵時。 第 4 個故事首先可見,現在屏幕有 2,3 和 4 可見。 但第 4 層的索引將僅保持在第 3 層。 現在索引就像

索引 0 -> 故事編號 2

索引 1 -> 故事編號 3

索引 2 -> 故事編號 4

因此,不應將position作為參數傳遞,而應在getChildAt中傳遞currentPosition

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM