我正在使用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代码。即使我显示了新项目。
答案 0 :(得分:0)
在onClick()ViewHolder vh =(ViewHolder)v.getTag();
中添加第一行。
答案 1 :(得分:0)
rowView
仅在您的列表第一次加载时null
。
将您的onclick移动到if (rowView == null)
块之外。此外,建议在列表适配器中使用持有者模式。