我试图在服装列表上的用户点击按钮后锁定按钮。 从hayoola获取的列表项,然后我使用viewholder显示数据 到列表中的用户。 如果用户单击“接受”或“拒绝”按钮。结果将传递给hayoola和 所选按钮将被禁用 问题是在用户点击按钮错误按钮被禁用后。五次点击后,所有剩余的按钮也会被禁用。
这是我的适配器代码:
static class myviewholder {
TextView textfromhayoola;
ImageButton buttonaccpet;
ImageButton buttonrefuse;
}
public View getView(int position, View convertView, ViewGroup parent) {
try {
final myviewholder viewHolder;
final int itemlocation = position;
if (convertView == null) {
convertView = inflater.inflate(R.layout.listforuser, null);
viewHolder = new myviewholder();
viewHolder.textfromhayoola = (TextView) convertView.findViewById(R.id.textfromhayoola);
viewHolder.buttonaccpet= (ImageButton) convertView.findViewById(R.id.buttonaccpet);
viewHolder.buttonrefuse= (ImageButton) convertView.findViewById(R.id.buttonrefuse);
convertView.setTag(viewHolder);
}else{
viewHolder = (myviewholder) convertView.getTag();
}
HashMap<String, String> myhayooladata= new HashMap<String, String>();
myhayooladata = data.get(position);
if (myhayooladata != null) {
viewHolder.textfromhayoola.setTag(myhayooladata.get("id_textfromhayoola"));
viewHolder.textfromhayoola.setText(myhayooladata.get("textfromhayoola"));
viewHolder.buttonaccpet.setTag(getItemId(position));
viewHolder.buttonrefuse.setTag(getItemId(position));
viewHolder.buttonaccpet.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
performOnBackgroundThread(new Runnable() {
public void run() {
passdatatohayoola(viewHolder.textfromhayoola.getTag().toString(),"accpet");
}
});
arg0.findViewWithTag(viewHolder.buttonaccpet.getTag()).setEnabled(false);
arg0.findViewWithTag(viewHolder.buttonrefuse.getTag()).setEnabled(false);
}
});
viewHolder.buttonrefuse.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
performOnBackgroundThread(new Runnable() {
public void run() {
passdatatohayoola(viewHolder.textfromhayoola.getTag().toString(),"refuse");
}
});
arg0.findViewWithTag(viewHolder.buttonaccpet.getTag()).setEnabled(false);
arg0.findViewWithTag(viewHolder.buttonrefuse.getTag()).setEnabled(false);
}
});
答案 0 :(得分:0)
鹤鹤。你觉得那样吗?只会创建“n /您的记录数”视图?
假设: 如果您有100条记录,则会绘制10行。
10行不会重新绘制。
第1行的按钮接受被禁用,表示行11 + n的按钮接受是相同的。 :d
可能是你的问题。
请阅读:
让我告诉你一些关于ViewHolder模式的事情。
将数据加载到ListView
或GridView
或类似的内容时。
如果您的数据有1000条记录,...... ListView
不会加载1000条记录。它只是加载“n条记录”。 “n”是与您的屏幕设备兼容的记录数。
示例:n = 10。
向下滚动时,ListView
会加载更多数据。在这种情况下,每行(行的视图)将重新绘制。
如果ListView
有大量数据,当使用向上或向下滚动时,您会发现您的应用会很慢...因为视图正在重新绘制。
ViewHolder是帮助您解决问题的模式。
当您使用ViewHolder
模式时,将创建仅“n”(在此示例中为n = 10)个视图。
所以,在你的问题中。我可以告诉你:
可能是您实施ViewHolder
不正确。
行。让我告诉你解决方案。
if (convertView == null) {
//You just findView and set for view
// viewHolder = new ViewHolder();
// viewHolder.yourBtn = convertView.findViewById(R.id.some_view_id);
// convertView.setTag(viewHolder);
} else {
//Right here, you will get viewHolder, because convertView is not null. It mean the viewHolder is existed.
}
就在这里,这意味着每次你都要设置数据(你不会缓存数据,只是缓存VIEW)
假设您的数据是一个对象,而对象具有代表按钮状态的属性。
MyObject {
boolean objStatus;
}
以及设置数据时
viewHolder.yourBtn.setEnable(instanceOfMyObject.objStatus);