Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView从特定视图修改其他视图_Android - Fatal编程技术网

Android ListView从特定视图修改其他视图

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

我有一个包含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;
}
私有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;
}