2017-04-05 49 views
0

我必須在列表視圖上執行一次點擊,在onItemClick我得到所選視圖的位圖。當我手動點擊它的工作,但是當我以編程方式進行點擊,視圖的高度等於我的代碼0 這裏片段PerformClick在ListView上返回一個高度等於0的視圖(Android)

listMedic.performItemClick(
    getViewByPosition(position), position, adapter.getItemId(position)); 


public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
    ListElement elem = (ListElement) listMedic.getItemAtPosition(position); 

    try { 

     QuantityPopUp quantityPopUp = new QuantityPopUp(context); 
     quantityPopUp.setImageAndPosition(getBitMapOfView(v), v, this, getResources().getString(R.string.valid_q_text_bt)); 
     quantityPopUp.setQuantity(Float.parseFloat(elem.getqDonn().replace(',', '.'))); 
     quantityPopUp.setListElementAdapter((ListElementAdapter) listMedic.getAdapter()); 
     quantityPopUp.setIndex(position); 
     contentLayout.addView(quantityPopUp); 

     popUpI = quantityPopUp; 

     darkenView(); 
    } catch (NullPointerException e) { 
    } 
} 
private Bitmap getBitMapOfView(View v){ 

    //récupérer la vue en tant que bitmap 

    v.setDrawingCacheEnabled(true); 
    v.buildDrawingCache(); 

    return Bitmap.createBitmap(v.getDrawingCache(true)); 
} 


public View getViewByPosition(int pos) { 
    final int firstListItemPosition = listMedic.getFirstVisiblePosition(); 
    final int lastListItemPosition = firstListItemPosition + listMedic.getChildCount() - 1; 

    if (pos < firstListItemPosition || pos > lastListItemPosition) { 
     return listMedic.getAdapter().getView(pos, null, listMedic); 
    } else { 
     final int childIndex = pos - firstListItemPosition; 
     return listMedic.getChildAt(childIndex); 
    } 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_element_layout, parent, false); 
    } 

    // récupérer l'item par sa position dans la vue 
    ListElement listElement = getItem(position); 

    //récupérer les éléments à remplir 
    LinearLayout listElementLayout = (LinearLayout) convertView.findViewById(R.id.listElementLayout); 
    TextView denomMedic = (TextView) convertView.findViewById(R.id.denomMedic); 
    TextView denom2Medic = (TextView) convertView.findViewById(R.id.denom2Medic); 
    TextView qPres = (TextView) convertView.findViewById(R.id.qPres); 
    TextView qDonn = (TextView) convertView.findViewById(R.id.qDonn); 
    ImageView compIcon = (ImageView) convertView.findViewById(R.id.compIcon); 

    //définir un touch listener pour afficher l'historique 
    listElementLayout.setTag(position); 

    //remplir les elements avec les informations 
    denomMedic.setText(listElement.getDenomMedic()); 
    denom2Medic.setText(listElement.getDenom2Medic()); 
    qPres.setText(listElement.getqPres()); 
    qDonn.setText(listElement.getqDonn()); 
    compIcon.setImageDrawable(listElement.getIconBac()); 

    //retourner l'élément construit 
    return convertView; 
} 
+0

getViewByPosition()如何工作? –

+0

哦,對不起,我錯過了 –

+0

請添加getViewByPosition()代碼作爲您的問題的一部分(這是很難閱讀裏面的評論)。你還可以添加你的getView()代碼嗎? –

回答

0

你的問題的根本原因是,在某些情況下,你是試圖從View獲得一個從未佈局和測量的位圖。 當您通過直接撥打getView()來獲取getViewByPosition()中的視圖時,會發生這種情況。不建議從這樣的列表中查看視圖,除非您有很好的理由。

解決你的問題,你有兩個選擇:

1)修復您的getViewByPosition()回到已經被測量,並已準備好被吸引到一個位圖(這個答案可以提供幫助的一個觀點:Converting a view to Bitmap without displaying it in Android?) 。

2)僅在已繪製的視圖上調用getBitMapOfView()

+0

好的。我實際上做的是將一個對象添加到適配器notifyDataSetChanged中,然後在該行上單擊。如果我理解的很好,問題是我的新行沒有繪製出來?我該如何等待它?謝謝。 –

0

我在Doron Yakovlev-Golani的幫助下找到了答案。我實際上添加了一個Thread()和一個睡眠時間。我不知道這是否是最好的答案,但它的工作原理。

new Thread(new Runnable() { 
         @Override 
         public void run() { 
          try { 
           Thread.sleep(500); 
           runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 
             try { 
              listMedic.performItemClick(
                getViewByPosition(position), position, adapter.getItemId(position)); 
             } catch (NullPointerException e) { 
              e.printStackTrace(); 
             } 
            } 
           }); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 
        }).start(); 
相關問題