【发布时间】:2014-07-15 16:01:52
【问题描述】:
我正在使用 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 代码。即使我显示了新项目。
【问题讨论】:
-
我发现了我的问题,在我的子布局(包括我的网格视图)的整个重建之前,顶部布局(相对布局)没有被清除。现在,我在重建所有视图之前先清除它,顶部布局不再吸引我的点击。
标签: android gridview adapter onclicklistener