【问题标题】:PerformClick on ListView Return a View with height equals to 0 (Android)PerformClick on ListView 返回一个高度等于 0 的视图 (Android)
【发布时间】:2017-08-31 04:29:08
【问题描述】:

我必须单击列表视图,在 onItemClick 中我得到所选视图的位图。当我手动单击它时,它可以工作,但是当我以编程方式执行单击时,视图的高度等于 0。 这是我的代码片段

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;
}

【问题讨论】:

  • 你的 getViewByPosition() 是如何工作的?
  • 对不起,我错过了
  • 请在您的问题中添加 getViewByPosition() 代码(在评论中很难阅读)。你也可以添加你的 getView() 代码吗?

标签: android listview onitemclick


【解决方案1】:

问题的根本原因是,在某些情况下,您正试图从从未布局和测量过的View 获取位图。 当您通过直接调用getView()getViewByPosition() 中获取视图时,就会发生这种情况。除非您有充分的理由,否则不建议从此类列表中获取视图。

要解决您的问题,您有两种选择:

1) 修复您的 getViewByPosition() 以返回已测量并准备绘制到位图的视图(此答案可以帮助解决此问题:Converting a view to Bitmap without displaying it in Android?)。

2) 仅在已绘制的视图上调用 getBitMapOfView()

【讨论】:

  • 好的。我实际上所做的是将一个对象添加到我的适配器 notifyDataSetChanged,然后单击该行。如果我理解得很好,问题是我的新行还没有绘制?我怎么能等到呢?谢谢。
【解决方案2】:

我在 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多