gpt4 book ai didi

android - 如何为带有图像的 ListView 设置单一选择模式

转载 作者:可可西里 更新时间:2023-11-01 19:09:21 24 4
gpt4 key购买 nike

我有一个带有图像的 ListView 。当我选择每个项目时,图像会更改为单击图像。但是当我选择另一个项目时,两个图像都会更改。我只希望所选项目更改图像。它必须像单选按钮一样工作使用单选模式。请帮助。

public class ProvierActivity extends Activity {
private String text[] = { "BroadStripe-Cable (Seattle)", "BroadStripe-Digital (Seattle)",
"BroadStripe-Cable (Seattle)", "Comcast king county south)", "BroadStripe-Cable (Seattle)",
"Comcast king county south", "BroadStripe-Digital (Seattle)", "BroadStripe-Digital (Seattle)",
"BroadStripe-Cable (Seattle)", "Comcast king county south" };

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final ListView list = (ListView) findViewById(R.id.listview_id);

list.setAdapter(new ArrayAdapter<String>(this, R.layout.list,
R.id.title, text));

list.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
// TODO Auto-generated method stub

if (view.findViewById(R.id.img).getVisibility() == ImageView.VISIBLE) {
ImageView icon = (ImageView) view.findViewById(R.id.img);

icon.setImageResource(R.drawable.checked);
}
}
});
}
}

最佳答案

这里推荐的解决方案是依赖内置的ListView的选择支持为其指定单选模式:

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

那么你应该让你的列表项去实现去实现Checkable界面;这需要对布局的 Root View 进行一些自定义。假设它以 LinearLayout 作为根,实现可能如下所示:

public class MyListItem extends LinearLayout implements Checkable {

public MyListItem(Context context, AttributeSet attrs) {
super(context, attrs);
}

public MyListItem(Context context) {
super(context);
}

private boolean checked = false;

private ImageView icon;

@Override
protected void onFinishInflate() {
super.onFinishInflate();
icon = (ImageView)findViewById(R.id.img); // optimisation - you don't need to search for image view every time you want to reference it
}
@Override
public boolean isChecked() {
return checked;
}

@Override
public void setChecked(boolean checked) {
this.checked = checked;
if (icon.getVisibility() == View.VISIBLE) {
icon.setImageResource((checked) ? R.drawable.checked : R.drawable.unchecked);
}
}

@Override
public void toggle() {
setChecked(!checked);
}
}

当然,您的布局文件也应该更新为引用 MyListItem 类而不是 LinearLayout。

这可能是一种有点困难的方法,但它有一些好处,例如在重新创建 Activity 时自动恢复选中的项目。

另一种选择是再次使用列表的选择模式并覆盖适配器的 getView 以了解该项目是否被选中并相应地更新图像:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final ListView list = getListView();
list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
list.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item,
R.id.title, text) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
ImageView icon = (ImageView) v.findViewById(R.id.img);
if (list.isItemChecked(position)) {
icon.setImageResource(R.drawable.checked);
} else {
icon.setImageResource(R.drawable.unchecked);
}
return v;
}
});
}

但是这个版本有一些性能问题 - findViewById 和 setImageResource 是相对耗时的操作,所以你应该考虑使用一些缓存。我推荐看"The world of ListView" video了解有关此小部件的一些非常有用的提示。

后一种方法还将适配器绑定(bind)到 ListView ,这引入了不必要的耦合。

关于android - 如何为带有图像的 ListView 设置单一选择模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7413272/

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