2017-04-05 1 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) 이미 그려진 뷰에만 getBitMapOfView()을 호출하십시오.

+0

확인. 실제로 어댑터의 객체 인 notifyDataSetChanged를 추가 한 다음 해당 행을 클릭하면됩니다. 만약 내가 잘 이해한다면, 문제는 나의 새로운 행이 아직 그려지지 않았다는 것입니다. 나는 그것을 어떻게 기다릴 수 있습니까? 고맙습니다. –

0

나는 Doron Yakovlev-Golani의 도움으로 답을 찾았습니다. 실제로 Sleep 시간이있는 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(); 
관련 문제