Android Listview中的onClick侦听器更改另一行
我有一个包含三个文本视图和一个图像视图的列表视图。其中一个textview的可见性在xml中设置为“GONE” 但是,当我单击imageview时,我希望listview中的文本变得可见。这是可行的,但不是只显示该行的文本视图,而是显示另一行的文本视图 当我单击某行时,如何使该行的文本视图变为可见 这是我的密码Android Listview中的onClick侦听器更改另一行,android,android-layout,listview,android-arrayadapter,Android,Android Layout,Listview,Android Arrayadapter,我有一个包含三个文本视图和一个图像视图的列表视图。其中一个textview的可见性在xml中设置为“GONE” 但是,当我单击imageview时,我希望listview中的文本变得可见。这是可行的,但不是只显示该行的文本视图,而是显示另一行的文本视图 当我单击某行时,如何使该行的文本视图变为可见 这是我的密码 public class CustomListAdapter2 extends ArrayAdapter<ObjectItem> { //to reference the
public class CustomListAdapter2 extends ArrayAdapter<ObjectItem> {
//to reference the Activity
private final Activity context;
private ObjectItem[] data = null;
public CustomListAdapter2(Activity context, ObjectItem[] data) {
super(context, R.layout.most_lodged_complaints, data);
this.context = context;
this.data = data;
}
public View getView(int position, View view, ViewGroup parent) {
if (view == null) {
LayoutInflater inflater = context.getLayoutInflater();
view = inflater.inflate(R.layout.most_lodged_complaints, parent, false);
}
final ObjectItem objectItem = data[position];
TextView headerTextField = (TextView) view.findViewById(R.id.list_header);
TextView detailTextField = (TextView) view.findViewById(R.id.list_detail);
final TextView textView = (TextView) view.findViewById(R.id.list_detail2);
ImageView imageView = (ImageView) view.findViewById(R.id.most_complaints_expand);
headerTextField.setText(objectItem.header);
detailTextField.setText(objectItem.detail);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
textView.setVisibility(View.VISIBLE);
}
});
return view;
};
}
注意:我已尝试使用ViewHolder模式,但问题仍然存在,ListView重新使用该视图。永远不要忘记这一点
这样,如果在任何位置设置任何属性,则可能会在不同位置产生类似效果,因为同一视图最终将被重复使用
在代码中,您可以看到:
public View getView(int position, View view, ViewGroup parent) {
if (view == null) {
// I just create a view if received view is null...
// In another words, just create a View with View.GONE if current is null
} else {
// Since some View are re-used.. they are not null
// If you don't set visibility again, it will keep last state (in another workds, View.VISIBLE)
}
};
因此,在使用ListView时,必须在getViewint位置期间恢复视图的所有属性
如果更改可见性,则必须跟踪哪个位置可见,哪个位置不可见。然后,在getView期间再次设置正确的状态
您必须对每个属性执行此操作:setText、setVisibility、setClickable等。。。您必须恢复可能在其他位置发生变化的所有内容
因此,您可以保留一个单独的列表来跟踪哪个列表可见或不可见这只是一个示例:
public class CustomListAdapter2 extends ArrayAdapter<ObjectItem> {
private ObjectItem[] data = null;
private boolean[] viewVisibility = null;
public CustomListAdapter2(Activity context, ObjectItem[] data) {
...
this.data = data;
this.viewVisibility = new boolean[data.lenght];
}
public View getView(int position, View view, ViewGroup parent) {
...
final TextView textView = (TextView) view.findViewById(R.id.list_detail2);
if(viewVisibility[position]) {
textView.setVisibility(View.VISIBLE);
} else {
textView.setVisibility(View.GONE);
}
...
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
textView.setVisibility(View.VISIBLE);
viewVisibility[position] = true;
}
});
return view;
};
}
您需要使用一个MClickListener,它在回调方法中提供对单击视图的引用
此处参考:
此处的示例实现:它给出了以下错误java.lang.NullPointerException:尝试从空数组读取。我认为这是因为viewVisibility默认设置为null。我该怎么办?嗨,忘了添加此行this.viewVisibility=new boolean[data.lenght];现在工作很好,我很好grateful@johnson很高兴知道。。。当你发布这个新评论时,我正在读你的评论!!很高兴它起作用了!但是imageview不支持监听器,我应该怎么做?