简体   繁体   English

Android ListView仅在单击按钮的最后一行

[英]Android ListView only last row on button click

I have the following code: 我有以下代码:

static class ViewHolder {
    TextView camera;
    TextView players;
    TextView max_players;
    ImageView privata;
    Button Buton;
}
ViewHolder holder;
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    String variabile[] = getItem(position).split("\\s+");

    if(convertView == null)
    {
        LayoutInflater linflater = LayoutInflater.from(getContext());
        convertView = linflater.inflate(R.layout.custom_row, parent, false);
        holder = new ViewHolder();
        holder.camera = (TextView) convertView.findViewById(R.id.Nume);
        holder.players = (TextView) convertView.findViewById(R.id.players);
        holder.max_players = (TextView) convertView.findViewById(R.id.max_players);
        holder.privata = (ImageView) convertView.findViewById(R.id.privata);
        holder.Buton = (Button) convertView.findViewById(R.id.Buton);
        holder.camera.setText(variabile[0]);
        if (!variabile[1].equals("true")) {
            parola = false;
            holder.privata.setVisibility(View.INVISIBLE);
        }
        holder.players.setText(variabile[2]);
        holder.max_players.setText(variabile[3]);
        room_id = variabile[4];
        nume = variabile[5];
        holder.Buton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                hash = new HashMap<String, String>();
                hash.put("name", nume);
                hash.put("room", room_id);
                if (intra) {
                    holder.Buton.setText("Iesi");
                    site = siteul + "/join";
                    intra = false;
                } else {
                    holder.Buton.setText("Intra");
                    site = siteul + "/leave";
                    intra = true;
                }
                new ATask().execute(site);
            }
        });
        convertView.setTag(holder);
    }
    else
        holder = (ViewHolder) convertView.getTag();
    return convertView;
}

I'm trying to access a row from an AsyncTask on PostExecute and modify it like this: 我正在尝试从PostExecute上的AsyncTask访问一行,并像这样修改它:

TextView players_mare = holder.players;
players_mare.setText(rez.substring(2));

No matter the button pressed it seems to modify the textview of the last item in the list. 无论按下的按钮如何,似乎都可以修改列表中最后一项的文本视图。

This is happening because you are using holder . 这是因为您使用的是holder After rendering complete ListView it has reference of the last item in the ListView , so only last item is updated irrespective of the item on which button was clicked. 渲染完成后ListView它在最后一个项目的参考ListView ,所以只有最后一个项目,不论更新在其上单击按钮的项目。 You need to pass the reference of item in which button was clicked to the ATask class. 您需要将单击了按钮的项目的引用传递给ATask类。

  1. Add

     holder.Buton.setTag(holder); 

    after

     convertView.setTag(holder); 

    in getView() method getView()方法中

  2. Create a class level variable in ATask clas like this 像这样在ATask类中创建一个类级变量

     ViewHolder myHolder; 
  3. Add this in ATask ATask添加

     public ATask(ViewHolder view) { myHolder = view; } 
  4. Change ATask call like this 像这样更改ATask调用

     new ATask((ViewHolder) v.getTag()).execute(site); 
  5. In PostExecute replace every holder with myHolder PostExecute将所有holder替换为myHolder

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM