Android 在自定义适配器中遍历ListView
我有一个自定义的Android 在自定义适配器中遍历ListView,android,android-layout,android-listview,android-adapter,Android,Android Layout,Android Listview,Android Adapter,我有一个自定义的列表视图。每行包含一个TextView和ImageView 请看屏幕截图: 在项目上,单击我使ImageView可见。但问题是一次只能看到一个ImageView 我认为最好的方法是在单击时将所有其他imageview设置为不可见。在所有图像消失后,使单击的图像可见 但是我不知道如何在适配器中正确地迭代: private class TimeZoneItemAdapter extends ArrayAdapter<String> { private A
列表视图
。每行包含一个TextView
和ImageView
请看屏幕截图:
在项目上,单击我使ImageView
可见。但问题是一次只能看到一个ImageView
我认为最好的方法是在单击时将所有其他imageview
设置为不可见。在所有图像消失后,使单击的图像可见
但是我不知道如何在适配器中正确地迭代:
private class TimeZoneItemAdapter extends ArrayAdapter<String> {
private Activity myContext;
private ArrayList<String> datas;
public TimeZoneItemAdapter(Context context, int textViewResourceId, ArrayList<String> objects) {
super(context, textViewResourceId, objects);
myContext = (Activity) context;
datas = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.listview_item, null);
viewHolder = new ViewHolder();
viewHolder.postNameView = (TextView) convertView.findViewById(R.id.listview_item);
viewHolder.postImageView = (ImageView) convertView.findViewById(R.id.image_mark);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.postNameView.setText(datas.get(position));
viewHolder.postNameView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//clear all image views during iteration
View view;
for (int i = 0; i < datas.size(); i++) {
//dont know which parameter need there for proper iteration
view = getView(i, ?????, null);
ImageView image = (ImageView) view.findViewById(R.id.image_mark);
image.setVisibility(View.INVISIBLE);
}
if (viewHolder.postImageView.getVisibility() != View.VISIBLE) {
selectedTimeZone = viewHolder.postNameView.getText().toString();
viewHolder.postImageView.setVisibility(View.VISIBLE);
} else {
viewHolder.postImageView.setVisibility(View.INVISIBLE);
}
}
});
return convertView;
}
class ViewHolder {
TextView postNameView;
ImageView postImageView;
}
}
私有类时区适配器扩展了ArrayAdapter{
私人活动myContext;
私有数组列表数据;
公共时区适配器(上下文上下文、int-textViewResourceId、ArrayList对象){
超级(上下文、textViewResourceId、对象);
myContext=(活动)上下文;
数据=对象;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null){
LayoutInflater充气机=myContext.getLayoutInflater();
convertView=充气机。充气(R.layout.listview_项,空);
viewHolder=新的viewHolder();
viewHolder.postNameView=(TextView)convertView.findViewById(R.id.listview_项);
viewHolder.postImageView=(ImageView)convertView.findViewById(R.id.image_标记);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.postNameView.setText(data.get(position));
viewHolder.postNameView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//在迭代过程中清除所有图像视图
视图;
对于(int i=0;i
请帮助我或给我一些提示。我已经对这一点感到困惑了。有一个解决方案:
private static View lastClicked = null;
... ...
viewHolder.postNameView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View parentRow = (View) v.getParent();
ViewHolder viewHolder = (ViewHolder)parentRow.getTag();
if(viewHolder.postImageView.getVisibility() != View.VISIBLE)
{
//clear last clicked image
if(lastClicked != null)
{
ViewHolder lastHolder = (ViewHolder)lastClicked.getTag();
lastHolder.postImageView.setVisibility(View.INVISIBLE);
}
selectedTimeZone = viewHolder.postNameView.getText().toString();
viewHolder.postImageView.setVisibility(View.VISIBLE);
lastClicked = parentRow;
}
else
{
viewHolder.postImageView.setVisibility(View.INVISIBLE);
lastClicked = null;
}
});
希望这有帮助 有一种解决方案:
private static View lastClicked = null;
... ...
viewHolder.postNameView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View parentRow = (View) v.getParent();
ViewHolder viewHolder = (ViewHolder)parentRow.getTag();
if(viewHolder.postImageView.getVisibility() != View.VISIBLE)
{
//clear last clicked image
if(lastClicked != null)
{
ViewHolder lastHolder = (ViewHolder)lastClicked.getTag();
lastHolder.postImageView.setVisibility(View.INVISIBLE);
}
selectedTimeZone = viewHolder.postNameView.getText().toString();
viewHolder.postImageView.setVisibility(View.VISIBLE);
lastClicked = parentRow;
}
else
{
viewHolder.postImageView.setVisibility(View.INVISIBLE);
lastClicked = null;
}
});
希望这有帮助 有一种解决方案:
private static View lastClicked = null;
... ...
viewHolder.postNameView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View parentRow = (View) v.getParent();
ViewHolder viewHolder = (ViewHolder)parentRow.getTag();
if(viewHolder.postImageView.getVisibility() != View.VISIBLE)
{
//clear last clicked image
if(lastClicked != null)
{
ViewHolder lastHolder = (ViewHolder)lastClicked.getTag();
lastHolder.postImageView.setVisibility(View.INVISIBLE);
}
selectedTimeZone = viewHolder.postNameView.getText().toString();
viewHolder.postImageView.setVisibility(View.VISIBLE);
lastClicked = parentRow;
}
else
{
viewHolder.postImageView.setVisibility(View.INVISIBLE);
lastClicked = null;
}
});
希望这有帮助 有一种解决方案:
private static View lastClicked = null;
... ...
viewHolder.postNameView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View parentRow = (View) v.getParent();
ViewHolder viewHolder = (ViewHolder)parentRow.getTag();
if(viewHolder.postImageView.getVisibility() != View.VISIBLE)
{
//clear last clicked image
if(lastClicked != null)
{
ViewHolder lastHolder = (ViewHolder)lastClicked.getTag();
lastHolder.postImageView.setVisibility(View.INVISIBLE);
}
selectedTimeZone = viewHolder.postNameView.getText().toString();
viewHolder.postImageView.setVisibility(View.VISIBLE);
lastClicked = parentRow;
}
else
{
viewHolder.postImageView.setVisibility(View.INVISIBLE);
lastClicked = null;
}
});
希望这有帮助 我不会在视图上存储任何信息。我相信listview会回收它的视图,这样事情就会变得一团糟。尝试将数据与视图分开
我会尝试另一种方法。您的数据应该是
ArrayList<MyData> datas;
public class MyData{
String place;
boolean: checked = false;
}
然后在适配器getView
中,应根据选中的值显示/隐藏imageView,如下所示:
private class TimeZoneItemAdapter extends ArrayAdapter<MyData> {
private Activity myContext;
private ArrayList<MyData> datas;
public TimeZoneItemAdapter(Context context, int textViewResourceId, ArrayList<MyDatas> datas) {
super(context, textViewResourceId, datas);
this.datas = datas;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.listview_item, null);
}
TextView postNameView = (TextView) convertView.findViewById(R.id.listview_item);
TextView postImageView = (ImageView) convertView.findViewById(R.id.image_mark);
postNameView.setText(this.datas.get(position).place);
if(this.datas.get(position).checked){
postImageView.setVisibility(View.VISIBLE);
}else{
postImageView.setVisibility(View.INVISIBLE);
}
return convertView;
}
}
所有视图将自动更新 我不会在视图上存储任何信息。我相信listview会回收它的视图,这样事情就会变得一团糟。尝试将数据与视图分开
我会尝试另一种方法。您的数据应该是
ArrayList<MyData> datas;
public class MyData{
String place;
boolean: checked = false;
}
然后在适配器getView
中,应根据选中的值显示/隐藏imageView,如下所示:
private class TimeZoneItemAdapter extends ArrayAdapter<MyData> {
private Activity myContext;
private ArrayList<MyData> datas;
public TimeZoneItemAdapter(Context context, int textViewResourceId, ArrayList<MyDatas> datas) {
super(context, textViewResourceId, datas);
this.datas = datas;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.listview_item, null);
}
TextView postNameView = (TextView) convertView.findViewById(R.id.listview_item);
TextView postImageView = (ImageView) convertView.findViewById(R.id.image_mark);
postNameView.setText(this.datas.get(position).place);
if(this.datas.get(position).checked){
postImageView.setVisibility(View.VISIBLE);
}else{
postImageView.setVisibility(View.INVISIBLE);
}
return convertView;
}
}
所有视图将自动更新 我不会在视图上存储任何信息。我相信listview会回收它的视图,这样事情就会变得一团糟。尝试将数据与视图分开
我会尝试另一种方法。您的数据应该是
ArrayList<MyData> datas;
public class MyData{
String place;
boolean: checked = false;
}
然后在适配器getView
中,应根据选中的值显示/隐藏imageView,如下所示:
private class TimeZoneItemAdapter extends ArrayAdapter<MyData> {
private Activity myContext;
private ArrayList<MyData> datas;
public TimeZoneItemAdapter(Context context, int textViewResourceId, ArrayList<MyDatas> datas) {
super(context, textViewResourceId, datas);
this.datas = datas;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.listview_item, null);
}
TextView postNameView = (TextView) convertView.findViewById(R.id.listview_item);
TextView postImageView = (ImageView) convertView.findViewById(R.id.image_mark);
postNameView.setText(this.datas.get(position).place);
if(this.datas.get(position).checked){
postImageView.setVisibility(View.VISIBLE);
}else{
postImageView.setVisibility(View.INVISIBLE);
}
return convertView;
}
}
所有视图将自动更新 我不会在视图上存储任何信息。我相信listview会回收它的视图,这样事情就会变得一团糟。尝试将数据与视图分开
我会尝试另一种方法。您的数据应该是
ArrayList<MyData> datas;
public class MyData{
String place;
boolean: checked = false;
}
然后在适配器getView
中,应根据选中的值显示/隐藏imageView,如下所示:
private class TimeZoneItemAdapter extends ArrayAdapter<MyData> {
private Activity myContext;
private ArrayList<MyData> datas;
public TimeZoneItemAdapter(Context context, int textViewResourceId, ArrayList<MyDatas> datas) {
super(context, textViewResourceId, datas);
this.datas = datas;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.listview_item, null);
}
TextView postNameView = (TextView) convertView.findViewById(R.id.listview_item);
TextView postImageView = (ImageView) convertView.findViewById(R.id.image_mark);
postNameView.setText(this.datas.get(position).place);
if(this.datas.get(position).checked){
postImageView.setVisibility(View.VISIBLE);
}else{
postImageView.setVisibility(View.INVISIBLE);
}
return convertView;
}
}
所有视图将自动更新 在onClick中,您将遍历视图,确保它们都隐藏了图像,然后设置当前图像可见。你不需要自己做,只要告诉系统帮你做就行了
还请注意,当前代码将围绕适配器中的所有条目循环,并尝试获取它们的视图。。。但并不是所有人都会有一个,那些从屏幕上滚下来的人不会有一个视图
最简单的方法是删除onClick处理程序中除设置selectedTimeZone
行之外的所有内容,然后调用notifydatasetchange()
。这将使Android重新绘制当前屏幕上的所有视图
然后在setText()下面添加:
if (datas.get(position).equals(selectedTimeZone)) {
viewHolder.postImageView.setVisibility(View.VISIBLE);
} else {
viewHolder.postImageView.setVisibility(View.INVISIBLE);
}
因此,当系统重新绘制视图时,每个视图都会考虑将图像设置为可见,但只有当前视图会将其设置为可见。在onClick中,您将遍历视图并确保它们都隐藏了图像,然后在设置后,当前视图才可见。你不需要自己做,只要告诉系统帮你做就行了
还请注意,您的