视图持有者onclick事件中返回错误的项目

时间:2014-01-25 06:37:31

标签: android view

我试图在服装列表上的用户点击按钮后锁定按钮。 从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);      
            }
        });

1 个答案:

答案 0 :(得分:0)

鹤鹤。你觉得那样吗?只会创建“n /您的记录数”视图?

假设: 如果您有100条记录,则会绘制10行。

10行不会重新绘制。

第1行的按钮接受被禁用,表示行11 + n的按钮接受是相同的。 :d

可能是你的问题。

请阅读:

让我告诉你一些关于ViewHolder模式的事情。

将数据加载到ListViewGridView或类似的内容时。

如果您的数据有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);