Android - 适用于GridView的适配器中的O​​nClickListener

时间:2014-07-15 16:01:53

标签: android gridview adapter onclicklistener

我正在使用GridView来显示“车辆”列表(显示车辆的一些简短信息的矩形),当我点击一个矩形时,它会展开视图以显示更多信息。 这很好用。 但是当我想用其他数据重建gridview时,gridview的孩子们不再能够捕获到这些点击。 我不想使用一些onItemClickListener,因为它只是孩子们的显示/隐藏功能...... 所以我在自定义适配器的getView()函数中设置onClickListener。 这是我的适配器代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater) getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.encart_vehicule, parent, false);
        final ViewHolder vh = new ViewHolder();
        vh.text = (TextView) rowView.findViewById(R.id.libVehi);
        vh.text2 = (TextView) rowView.findViewById(R.id.heureEngagement);
        vh.back = (LinearLayout) rowView.findViewById(R.id.backcolor);
        vh.listEq = (LinearLayout) rowView.findViewById(R.id.equipage);
        vh.vIndicator = (View) rowView.findViewById(R.id.view1);
        vh.more = (TextView) rowView.findViewById(R.id.more);

        vh.vIndicator.setVisibility(View.GONE);
        vh.listEq.setVisibility(View.GONE);

        if (mlistMoyenMateriel.get(position).getLstPersonnels().size() == 0) {
            vh.more.setVisibility(View.GONE);
        } else {
            rowView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!vh.opened) {
                        vh.more.setVisibility(View.GONE);
                        vh.vIndicator.setVisibility(View.VISIBLE);
                        vh.listEq.setVisibility(View.VISIBLE);
                    } else {
                        vh.more.setVisibility(View.VISIBLE);
                        vh.vIndicator.setVisibility(View.GONE);
                        vh.listEq.setVisibility(View.GONE);
                    }
                    vh.opened = !vh.opened;
                }
            });
        }

        vh.back.setBackgroundColor(Color.parseColor("#"
                + mlistMoyenMateriel.get(position).getEtat()
                        .getm_strColor()));

        for (Personnel p : mlistMoyenMateriel.get(position)
                .getLstPersonnels()) {
            TextView tv = new TextView(getContext());
            tv.setText(p.getm_strNom() + " " + p.getm_strPrenom() + " "
                    + p.getm_strMatricule());
            Resources r = getContext().getResources();
            float px = TypedValue.applyDimension(
                    TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics());
            tv.setPadding(0, 0, 0, (int) px);
            vh.listEq.addView(tv);
        }
        rowView.setTag(vh);
    }

    ViewHolder holder = (ViewHolder) rowView.getTag();
    holder.text.setText(mlistMoyenMateriel.get(position).getType()
            + " "
            + mlistMoyenMateriel.get(position).getNumeroOrdre()
                    .substring(1) + " "
            + mlistMoyenMateriel.get(position).getCode_centre());
    holder.text2.setText(dateUtil.Date_heureToString(mlistMoyenMateriel
            .get(position).getdEngagement(), "dd MMMMMMMM HH:mm")
            + (mlistMoyenMateriel.get(position).getDureeASLL() == null ? ""
                    : "+" + mlistMoyenMateriel.get(position).getDureeASLL()
                            + "mn"));

    holder.back.setBackgroundColor(Color.parseColor("#"
            + mlistMoyenMateriel.get(position).getEtat().getm_strColor()));

    // holder.back.setBackgroundColor(Color.parseColor("#"+mlistMoyenMateriel.get(position).getEtat().getm_strColor()));

    return rowView;
}

然后我的gridView实例化:

    GridView gv = null;
    gv = (GridView) rlInter
            .findViewById(R.id.listAutresVehiculesEngages);
    gv.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
    MoyenMaterielAdapter mma = new MoyenMaterielAdapter(this,
            inter.getm_lstListeDesobjetVehiculePourCetteOperation());
    gv.setAdapter(mma);
    gv.invalidateViews();

当我第二次回忆这段代码时,列表被正确重建,但即使它从getView函数传入“rowView.setOnClickListener”,对孩子的点击也不再有效(它没有扩展我的视图)。我试图在点击事件上做一个Toast,它也不再显示了。

有谁知道这个问题?我做错了什么?我可以尝试使用OnItemClickListener,但我认为这个小功能会有点太多,知道它仍然有效,但只是第一次...... 谢谢你的帮助!

(我真的很抱歉我的英语)

编辑: 我错过了一些东西:第二次它没有传递setOnClickListener代码。即使我显示了新项目。

2 个答案:

答案 0 :(得分:0)

在onClick()ViewHolder vh =(ViewHolder)v.getTag();中添加第一行。

答案 1 :(得分:0)

rowView仅在您的列表第一次加载时null

将您的onclick移动到if (rowView == null)块之外。此外,建议在列表适配器中使用持有者模式。