Android ListView从特定视图修改其他视图
我有一个包含5行和5个按钮的ListView: 当我点击第一个按钮时,我用“B”替换它的文本 然后,我点击第二个按钮,我用“B”替换它的文本,但是我如何用“A”替换之前点击的按钮(第一个) 事实就是这样: 这是我单击按钮的代码:Android ListView从特定视图修改其他视图,android,Android,我有一个包含5行和5个按钮的ListView: 当我点击第一个按钮时,我用“B”替换它的文本 然后,我点击第二个按钮,我用“B”替换它的文本,但是我如何用“A”替换之前点击的按钮(第一个) 事实就是这样: 这是我单击按钮的代码: private int resource; private LayoutInflater inflater; ViewHolder holder; private Context ctx; public RingtoneAdapter(Context conte
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;
}
私有int资源;
私人充气机;
视窗座;
私有上下文ctx;
public RingtoneAdapter(上下文上下文、int-resourceId、列表对象){
超级(上下文、资源ID、对象);
this.ctx=上下文;
资源=资源ID;
充气器=充气器。从(上下文);
}
公共视图getView(最终整数位置、视图v、视图组父视图){
//奥格蒂·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多比阿莫·多
最终铃声铃声=getItem(位置);
如果(v==null){
v=充气机。充气(资源,父项,false);
holder=新的ViewHolder();
holder.btnPlay=(按钮)v.findViewById(R.id.btnPlay);
v、 setTag(支架);
}否则{
holder=(ViewHolder)v.getTag();
}
holder.btnPlay.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
按钮btnadd=(按钮)视图;
btnadd.setText(“B”);
notifyDataSetChanged();
}
});
返回v;
}
私有静态类视图持有者{
按钮btnPlay;
TextView-txtTitolo;
TextView-txtCategoria;
}
您需要重置未单击的项目
btn.setText("B"); // if the item was clicked
btn.setText("A"); // for all other items
您可以做的是,在所有元素中循环设置按钮的文本,如btn.setText(“A”)
,完成后,调用btn.setText(“B”)
您应该在列表视图
上使用OnItemClickListener
,这样做很简单,因为您在view holder中设置值,它不允许您访问列表视图
中的其他项,但是,通过使用OnItemClickListener
可以覆盖列表视图中的所有元素,一旦您按照自己喜欢的方式更新内容,就可以调用notifyDataSetChanged()
,因为可以这样做,所以还有另一种方法来解决问题
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);
ListView ListView=(ListView)findViewById(R.id.ListViewTestSevActivity\u ListView);
ArrayList items=新建ArrayList();
对于(int i=0;i<5;i++){
项目=新项目(“A”);
项目。添加(项目);
}
MyAdapter=新的MyAdapter(getApplicationContext(),R.layout.simple\u list\u item\u 1,items);
setAdapter(适配器);
这将根据您的需要处理初始化和代码的其余部分。代码也可在
私有类MyAdapter扩展了ArrayAdapter{
私人语境;
私有ArrayList项;
私人停车场;
公共MyAdapter(上下文上下文、int资源、ArrayList项){
超级(上下文、资源、项目);
this.a_context=上下文;
这个项目=项目;
a_layoutInflater=layoutInflater.from(此.a_上下文);
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图行=转换视图;
ViewHolder=null;
if(行==null){
行=a\u布局平坦。充气(R.layout.single\u item\u listview\u seven,父项,false);
holder=新的ViewHolder();
holder.button=(button)row.findViewById(R.id.ListViewTestSevActivity\u text\u按钮);
row.setTag(支架);
}否则{
holder=(ViewHolder)row.getTag();
}
最终项目=项目。获取(位置);
System.out.println(“+item.getText());
holder.button.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
对于(项目当前\项目:项目){
当前项目设置文本(“A”);
}
第2项(B)项;
notifyDataSetChanged();
}
});
holder.button.setText(“+item.getText());
返回行;
}
私有类视窗持有者{
按钮;
}
}
私人类项目{
字符串文本;
公共项目(字符串文本){
this.text=文本;
}
公共字符串getText(){
返回文本;
}
公共void setText(字符串文本){
this.text=文本;
}
}
如果我读对了,您一次只希望“选择”一个位置。如果是这种情况,您可以保留对所选位置的引用,并使用适配器的功能,而不是让多个按钮相互了解。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方法,该方法只需要知道如何在当前状态下呈现数据,而不需要处理在多个视图之间映射所需的复杂逻辑。您应该修改ListView not actual按钮的数据集,请上传您的适配器,以便我建议您使用我的适配器类更新betterI您使用ListView而不是RadioGroup的原因是什么?我的行比我绘制的行更复杂。它还包含其他元素,如TextView。行数不是固定的,但取决于数据库查询。我如何在活动中访问OnItemClickListener中的按钮?@aletede91,好的,我写了一些代码片段,可能有助于你理解它,因为你已经解决了它。谢谢,它很有效。但如果我点击同一个按钮两次,我希望它的文字是“A”再次。我该怎么做呢?您可以检查单击视图的当前文本。我更新了答案以反映这一点
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;
}