我有一个包含5行5个按钮的ListView:
当我点击第一个按钮时,我用“B”替换它。
然后,我点击第二个按钮,我用“B”替换它,但是如何用“A”替换之前点击的按钮(第一个)?
这才是真正发生的事情:
这是按钮点击的代码:
private int resource;
private LayoutInflater inflater;
ViewHolder holder;
private Context ctx;
public RingtoneAdapter(Context context, int resourceId, List<Ringtone> objects) {
super(context, resourceId, objects);
this.ctx = context;
resource = resourceId;
inflater = LayoutInflater.from(context);
}
public View getView(final int position, View v, ViewGroup parent) {
// Recuperiamo l'oggetti che dobbiamo inserire a questa posizione
final Ringtone ringtone = getItem(position);
if (v == null) {
v = inflater.inflate(resource, parent, false);
holder = new ViewHolder();
holder.btnPlay = (Button) v.findViewById(R.id.btnPlay);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
holder.btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Button btnadd = (Button) view;
btnadd.setText("B");
notifyDataSetChanged();
}
});
return v;
}
private static class ViewHolder {
Button btnPlay;
TextView txtTitolo;
TextView txtCategoria;
}
答案 0 :(得分:1)
如果我正确地阅读了这个内容,您只需要选择一个位置&#39;一次。如果是这种情况,您可以保留对所选位置的引用,并使用适配器的功能,而不是让多个按钮相互了解。 e.g。
private int selectedPosition = -1;
@Override
public View getView(final int position, View convertView, ViewGroup parent){
// ... Your ViewHolder / Ringtone initialization
if(position == selectedPosition)
holder.btnPlay.setText("B");
else holder.btnPlay.setText("A");
holder.btnPlay.setOnClickListener(new View.OnClickListener(){
if(holder.btnPlay.getText().toString().equals("A"))
selectedPosition = position;
else selectedPosition = -1;
notifyDataSetChanged();
});
return convertView;
}
这里的关键是允许notifyDataSetChanged()
在内部调用你的getView方法,然后实际上只需知道如何以当前状态呈现数据,而不是处理多个视图之间映射所需的复杂逻辑
答案 1 :(得分:0)
您需要重置未点击的项目
btn.setText("B"); // if the item was clicked
btn.setText("A"); // for all other items
你可以做的是,循环浏览设置按钮文字的所有元素,例如btn.setText("A")
,完成后调用btn.setText("B")
你应该在OnItemClickListener
上使用listview
,这很简单,因为你在视图持有者中设置了值,它不会让你访问{{1}中的其他项目1}},但是使用listview
,您可以在更新内容时覆盖OnItemClickListener
中的所有元素,因为您可以调用listview
,因为可以这样做,还有另一种方法可以查看在问题
notifyDataSetChanged()
这将照顾您希望它工作的代码的初始化和其余部分。代码也可以在github
上找到 ListView listView = (ListView) findViewById(R.id.ListViewTestSevenActivity_listView);
ArrayList<Item> items = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Item item = new Item("A");
items.add(item);
}
MyAdapter adapter = new MyAdapter(getApplicationContext(), R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);