2013-04-22 71 views
2

我有一個列表視圖 列表視圖中的每一行都有450dp的高度,例如 因此在大多數情況下,listview將呈現在MOST 3項當時。Android列表視圖項目未在setVisibility(View.VISIBLE)之後繪製

當列表視圖最初加載時,每行只是一個帶有「顯示詳細信息」按鈕的圖像(全部包含在相對佈局中)當用戶單擊按鈕時,它會隱藏當前相對佈局通過調用setVisibility(View.GONE)創建一個圖像和一個按鈕,並通過調用setVisibility(View.VISIBLE)來顯示另一個視圖(LinearLayout)。

記住BOTH相對佈局和Linear Layout駐留在相同的xml中, Adapter.getView(),我只是在可見性方面切換其中一個。

問題是,在線性佈局上調用setVisibility(View.VISIBLE)後,它不顯示。它確實成功隱藏了相對佈局,但沒有出現線性佈局。

它只會在列表視圖中的新項目需要通過上下滾動列表視圖呈現後纔會出現。

我如何強制相對佈局顯示?通過強制重繪?我試圖通過調用invalidate,它沒有工作。

我也試過requestLayout,但是再次沒用。我也試過notifyDataSetChanged(),它沒有工作,我不認爲我應該調用它,因爲適配器中的數據沒有改變,我簡單地隱藏和顯示一個新的視圖。

請幫助

編輯: 基於butcode的幫助,但沒有奏效

for(int i=start, j=list.getLastVisiblePosition();i<=j;i++) { 
    if(list.getItemAtPosition(vh.position)==list.getItemAtPosition(i)){ 
     final View view = list.getChildAt(i-start); 
     final int index = i; 
     view.requestLayout(); 
     lv.invalidateChild(view, new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom())); 
     runOnUiThread(new Runnable() { 
      @Override 
       public void run(){ 
        //lv.invalidateChild(view, new Rect(view.getLeft(), 
         //view.getTop(), view.getRight(), view.getBottom()));  
        lv.requestChildRectangleOnScreen(view, new Rect(view.getLeft(), 
          view.getTop(), view.getRight(), view.getBottom()), false); 
        view.requestLayout(); 
        list.getAdapter().getView(index, view, list); 
     } 
    }); 
    break; 
    } 
} 
+0

你打電話notifyDataSetChange()方法的onclick您的按鈕嗎? – Ankit 2013-04-22 17:54:45

回答

0

系統hanler列表視圖非常effectlly,當一個項目是要能看不到的,anthrod項目將顯示,系統將重新使用舊物品的句子。如果將項目內容視圖設置爲View.GONE,那麼當您獲取項目實例時,它的內容視圖的狀態爲View.Gone,因此您必須手動將項目的內容變爲View.VISIBLE

+0

你的回答沒有幫助,我不明白你想說什麼。我已經手動將項目的可見性設置爲可見。 – XyzNullPointer 2013-04-22 03:36:34

0

您應該使用requestChildRectangleOnScreen(),就像這樣。 這是我的整個代碼:一個不同的情況是:我不會隱藏原始佈局。但顯示/隱藏子佈局運行良好。也許你可以參考它。

 @Override 
    public void onClick(final View v) { 
     if (mResultView == null) { 
      return; 
     } 

     View buttonLayout = mResultView.findViewById(R.id.call_button); 
     if (buttonLayout == null) { 
      return; 
     } 

     switch (buttonLayout.getVisibility()) { 
      case View.GONE: 
       for (View view : mVisibleCallButtons) { 
        view.setVisibility(View.GONE); 
       } 

       mVisibleCallButtons.clear(); 
       displayCallButton(buttonLayout, true); 
       mVisiblePosition = mPosition; 
       Handler handler = new Handler(); 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         if (mListView != null && mResultView != null) { 
          mListView.requestChildRectangleOnScreen(mResultView, new Rect(0, 0, 
            mResultView.getWidth(), mResultView.getHeight()), false); 
         } 
        } 
       }); 
       break; 
      case View.VISIBLE: 
      default: 
       displayCallButton(buttonLayout, false); 
       mVisiblePosition = -1; 
       break; 
     } 
    } 
}; 

    private void displayCallButton(View btnLayout, boolean visible) { 
    if (visible) { 
     btnLayout.setVisibility(View.VISIBLE); 
     mVisibleCallButtons.add(btnLayout); 
    } else { 
     btnLayout.setVisibility(View.GONE); 
     mVisibleCallButtons.remove(btnLayout); 
    } 
} 

這裏是項目佈局的xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical"> 

<LinearLayout 
    android:nextFocusRight="@+id/secondary_action_button" 
    android:layout_weight="1" > 

    <LinearLayout 
     android:id="@+id/actions_view_container" 
     android:paddingBottom="@dimen/quickcontact_list_item_padding_bottom" > 

     <TextView 
      android:id="@android:id/text2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <TextView 
      android:id="@android:id/text1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 
    </LinearLayout> 

</LinearLayout> 

<LinearLayout 
    android:id="@+id/call_button" 
    android:layout_width="match_parent" 
    android:layout_weight="1" 
    android:visibility="gone" > 

    <include layout="@layout/call_button" /> 
</LinearLayout> 

+0

謝謝你的回答,那沒用,我已經更新了我的原始問題,以顯示我根據你的建議寫的片段。 – XyzNullPointer 2013-04-22 05:16:08

+0

嗨再次感謝buptcoder,但是你的mResultView是什麼? – XyzNullPointer 2013-04-22 07:37:16

+0

mResultView是你的relativelayout和linearlayout的父視圖,在我的例子中,它是用我提供的佈局文件創建的。 – buptcoder 2013-04-22 09:09:00