[英]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
类。
Add 加
holder.Buton.setTag(holder);
after 后
convertView.setTag(holder);
in getView()
method 在getView()
方法中
Create a class level variable in ATask
clas like this 像这样在ATask
类中创建一个类级变量
ViewHolder myHolder;
Add this in ATask
在ATask
添加
public ATask(ViewHolder view) { myHolder = view; }
Change ATask
call like this 像这样更改ATask
调用
new ATask((ViewHolder) v.getTag()).execute(site);
In PostExecute
replace every holder
with myHolder
在PostExecute
将所有holder
替换为myHolder
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.