簡體   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