繁体   English   中英

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

[英]Android ListView only last row on button click

我有以下代码:

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

我正在尝试从PostExecute上的AsyncTask访问一行,并像这样修改它:

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

无论按下的按钮如何,似乎都可以修改列表中最后一项的文本视图。

这是因为您使用的是holder 渲染完成后ListView它在最后一个项目的参考ListView ,所以只有最后一个项目,不论更新在其上单击按钮的项目。 您需要将单击了按钮的项目的引用传递给ATask类。

  1.  holder.Buton.setTag(holder); 

     convertView.setTag(holder); 

    getView()方法中

  2. 像这样在ATask类中创建一个类级变量

     ViewHolder myHolder; 
  3. ATask添加

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

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

暂无
暂无

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

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