2017-04-05 20 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(); 
相关问题