2017-04-05 4 views
0

リストビューのクリックをonItemClickで実行する必要があります。選択したビューのビットマップが取得されます。私は手動でクリックすると、それが仕事だが、私はプログラム的にクリックを実行するときPerformClick on 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

あなたの問題の根本的な原因は、いくつかのケースでは、あなたがしていることである、ビューの高さは、私のコードのここで0 フラグメントに等しいです一度もレイアウトされ測定されていないViewからビットマップを取得しようとしています。 getViewByPosition()でビューを取得しているときは、getView()を直接呼び出すと発生します。非常に良い理由がない限り、このようなリストからビューを取得することはお勧めしません。

1)あなたのgetViewByPosition()が既に測定され、(この答えはそれを支援することができますビットマップに描画する準備ができているビューを返すように修正しました::Converting a view to Bitmap without displaying it in Android?)を

次の2つのオプションがあり、あなたの問題を解決するために、 。

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(); 
関連する問題