PerformClick在ListView上返回一个高度等于0的视图(Android)
我必须在列表视图上执行一次点击,在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;
}
你的问题的根本原因是,在某些情况下,你是试图从View
获得一个从未布局和测量的位图。 当您通过直接拨打getView()
来获取getViewByPosition()
中的视图时,会发生这种情况。不建议从这样的列表中查看视图,除非您有很好的理由。
解决你的问题,你有两个选择:
1)修复您的getViewByPosition()
回到已经被测量,并已准备好被吸引到一个位图(这个答案可以提供帮助的一个观点:Converting a view to Bitmap without displaying it in Android?) 。
2)仅在已绘制的视图上调用getBitMapOfView()
。
好的。我实际上做的是将一个对象添加到适配器notifyDataSetChanged中,然后在该行上单击。如果我理解的很好,问题是我的新行没有绘制出来?我该如何等待它?谢谢。 –
我在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();
getViewByPosition()如何工作? –
哦,对不起,我错过了 –
请添加getViewByPosition()代码作为您的问题的一部分(这是很难阅读里面的评论)。你还可以添加你的getView()代码吗? –