- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 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
设置点击监听器的方式。您仅针对 convertView
为 null
的情况设置 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/
我在获取列表项时遇到问题,下面是我的 hibernate 代码,在该代码之后是我的方法..下面是我的 junit 测试。我如何确保查询正确执行,以及如何检查结果是否实际工作..这个查询应该返回几个pi
我正在尝试填充对象 Point 3D 的 vector 。我的应用程序读取一个 csv 文件以通过三个坐标 x、y、z 加载 vector 。我使用 float 类型。这是我的代码。 main.cpp
如果我有一个 DataTemplate(或类似的东西),我可以在 Canvas 中使用非 UIElements 吗?我觉得我以前做过这个,这是可能的,但我想不通。这是一些代码...
何时调用类方法 fetchItems()而不是 getItems() ?有区别吗? fetchImage()对比 getImage()等等... 最佳答案 “获取”通常被认为是一个本地操作,只涉及戳内
我的数组中有多个项目,比如说超过 14 个项目。 如何以这种方式将它们分为 2 个不同的组:前 3 个(#1,2,3)将在数组 A 中,接下来的 4 个(#4,5,6,7)将在数组 B 中,下一个 3
这是我正在解决的问题: Assume that the developers of Myro are developing a new black box function called travel
有一个列表框,里面有一些项目。还有一个带有 3x3 矩阵的网格。用户将拖动一个项目并将其放在网格的一个单元格上。 我发现的大多数示例都是关于从一个列表框拖放到另一个列表框的。但我想放入一个网格单元格。
我是一名优秀的程序员,十分优秀!