gpt4 book ai didi

android - BaseAdapter 选择项和处理问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:09 26 4
gpt4 key购买 nike

我有一个 ListView,它扩展了 BaseAdapter。我有一个数据 [] 数组。 ListView 正确膨胀和填充。我想要做的是在用户选择项目时以及是否选择了上一个项目时,使 ImageView 在列表项上可见(基本上是膨胀 View 右侧的支票图像) ,我只是隐藏了那个 ImageView。这也很好用。

但在我选择一个新项目并来回滚动后,我看到了奇怪的行为,支票图像有时在多个列表项目中可见,或者隐藏在当前选择的实际项目中。有人可以帮忙解释一下我做错了什么吗?

我在 onCreate 方法中有这两行:

    adap = new EfficientAdapter(this);
lstview.setAdapter(adap);

和适配器代码:

public static class EfficientAdapter extends BaseAdapter implements Filterable {
private LayoutInflater mInflater;
private Context context;
private ImageView CurrentSelectedImageView;
private Integer CurrentPosition = 14;


public EfficientAdapter(Context context) {
mInflater = LayoutInflater.from(context);
this.context = context;
}


public View getView(final int position, View convertView, ViewGroup parent) {

ViewHolder holder;

//Log.e("TAG",String.valueOf(position));

if (convertView == null) {
convertView = mInflater.inflate(R.layout.adaptor_content, null);

holder = new ViewHolder();
holder.textLine = (TextView) convertView.findViewById(R.id.txtCategoryCaption);
holder.iconLine = (ImageView) convertView.findViewById(R.id.iconLine);
holder.imgCheckbox = (ImageView) convertView.findViewById(R.id.imgCheck);


//If the CurrentPosition == position then make the checkbox visible else dont.
if (CurrentPosition == position){

holder.imgCheckbox.setVisibility(View.VISIBLE);
}else{
holder.imgCheckbox.setVisibility(View.INVISIBLE);
}


final ImageView Checkbox = holder.imgCheckbox;

//Now if the list item is clicked then set the position as the current item and make the checkbox visible.

convertView.setOnClickListener(new OnClickListener() {
private int pos = position;

@Override
public void onClick(View v) {
if (CurrentSelectedImageView!=null){
CurrentSelectedImageView.setVisibility(View.INVISIBLE);
}
Checkbox.setVisibility(View.VISIBLE);
CurrentSelectedImageView = Checkbox;
CurrentPosition = pos;

}
});

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}


int id = context.getResources().getIdentifier("nodeinsert", "drawable", context.getString(R.string.package_str));
if (id != 0x0) {
mIcon1 = BitmapFactory.decodeResource(context.getResources(), id);
}

holder.iconLine.setImageBitmap(mIcon1);
holder.textLine.setText(String.valueOf(data[position]));


if (CurrentPosition == position){
Log.e("TAG",CurrentPosition + "---" + String.valueOf(position));
holder.imgCheckbox.setVisibility(View.VISIBLE);
}else{
holder.imgCheckbox.setVisibility(View.INVISIBLE);
}


return convertView;
}



static class ViewHolder {
TextView textLine;
ImageView iconLine;
ImageView imgCheckbox;
}

@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return null;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return data.length;
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data[position];
}

}

最佳答案

But after I select a new item and scroll back and forth I see wierd behavior, the check image is sometimes visible in multiple list items or is hidden in the actual item that is currently selected.

这很可能发生,因为您为 convertView 设置点击监听器的方式。您仅针对 convertViewnull 的情况设置 OnCLickListener 但是当您上下滚动 ListView 时,行将被回收,您最终会得到与其他行相同的监听器。

无论如何,如果您只想让图像在一行中可见,则有一种更简单的方法。首先,您应该将 OnCLickListener 放在 convertView 上,然后在 ListView 元素上使用 OnItemClickListener。从这个监听器回调中,您将修改行:

lstview.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> l, View v, int position,
long id) {
View oldView = l.getChildAt(adap.getSelectedPosition());
ImageView img;
if (oldView != null && adap.getSelectedPosition() != -1) {
img = (ImageView) oldView.findViewById(R.id.imageView1);
img.setVisibility(View.INVISIBLE);
}
img = (ImageView) v.findViewById(R.id.imageView1);
img.setVisibility(View.VISIBLE);
adap.setSelectedPosition(position);
}
});

然后像这样修改适配器:

// a field in the adapter
private int mSelectedPosition = -1;

// getter and setter methods for the field above
public void setSelectedPosition(int selectedPosition) {
mSelectedPosition = selectedPosition;
notifyDataSetChanged();
}

public int getSelectedPosition() {
return mSelectedPosition;
}

// and finally your getView() method
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.adaptor_content, parent, false);
holder = new ViewHolder();
holder.textLine = (TextView) convertView.findViewById(R.id.txtCategoryCaption);
holder.iconLine = (ImageView) convertView.findViewById(R.id.iconLine);
holder.imgCheckbox = (ImageView) convertView.findViewById(R.id.imgCheck);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (mSelectedPosition == position) {
holder.imgCheckbox.setVisibility(View.VISIBLE);
} else {
holder.imgCheckbox.setVisibility(View.INVISIBLE);
}
// what is the point of this call?!
// you should move this to another place(like the adapter's constructor), the getIdentifier()
// method is a bit slow and you call it each time the adapter calls getView()
// you should never use it in the getView() method(), especially as all you do is get the id of the same drawable again and again
int id = context.getResources().getIdentifier("nodeinsert", "drawable", context.getString(R.string.package_str));
// ?!?
if (id != 0x0) {
mIcon1 = BitmapFactory.decodeResource(context.getResources(), id);
}
holder.iconLine.setImageBitmap(mIcon1);
holder.textLine.setText(String.valueOf(data[position]));
return convertView;
}

关于android - BaseAdapter 选择项和处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11316238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com