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

时间:2016-02-15 20:05:54

标签: android

我有一个包含5行5个按钮的ListView:

enter image description here

当我点击第一个按钮时,我用“B”替换它。

enter image description here

然后,我点击第二个按钮,我用“B”替换它,但是如何用“A”替换之前点击的按钮(第一个)?

enter image description here

这才是真正发生的事情:

enter image description here

这是按钮点击的代码:

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;
}

2 个答案:

答案 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);