错误的项目回报鉴于架onclick事件 [英] wrong item return in view holder onclick event

查看:120
本文介绍了错误的项目回报鉴于架onclick事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试着服装名单上的用户点击按钮后锁定按钮。
列表的项目从hayoola获取,然后我用viewholder显示数据
用户在列表中。
如果用户点击接受或拒绝按钮。其结果将被传递给hayoola和
选择的按钮将被禁用
问题是后用户点击按钮按错键禁用得到。而五年后点击所有剩余的按钮变得禁用了。

这是我的适配器code:

 静态类myviewholder {
    TextView的textfromhayoola;
    的ImageButton buttonaccpet;
    的ImageButton buttonrefuse;}
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
尝试{
    最后myviewholder viewHolder;
    最终诠释itemlocation =位置;
    如果(convertView == NULL){
        convertView = inflater.inflate(R.layout.listforuser,NULL);
            viewHolder =新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);
        }其他{
            viewHolder =(myviewholder)convertView.getTag();
        }
        HashMap的<字符串,字符串> myhayooladata =新的HashMap<字符串,字符串>();
        myhayooladata = data.get(位置);
        如果(myhayooladata!= NULL){
              viewHolder.textfromhayoola.setTag(myhayooladata.get(id_textfromhayoola));
            viewHolder.textfromhayoola.setText(myhayooladata.get(textfromhayoola));
            viewHolder.buttonaccpet.setTag(getItemId(位置));
            viewHolder.buttonrefuse.setTag(getItemId(位置));        viewHolder.buttonaccpet.setOnClickListener(新OnClickListener(){            公共无效的onClick(查看为arg0){                performOnBackgroundThread(新的Runnable(){
                    公共无效的run(){                            passdatatohayoola(viewHolder.textfromhayoola.getTag()的toString(),Accpet头);
                    }
                });
             arg0.findViewWithTag(viewHolder.buttonaccpet.getTag())的setEnabled(假)。
             arg0.findViewWithTag(viewHolder.buttonrefuse.getTag())的setEnabled(假)。
            }
        });
        viewHolder.buttonrefuse.setOnClickListener(新OnClickListener(){            公共无效的onClick(查看为arg0){                performOnBackgroundThread(新的Runnable(){
                    公共无效的run(){                            passdatatohayoola(viewHolder.textfromhayoola.getTag()的toString(),拒绝);
                    }
                });
             arg0.findViewWithTag(viewHolder.buttonaccpet.getTag())的setEnabled(假)。
             arg0.findViewWithTag(viewHolder.buttonrefuse.getTag())的setEnabled(假)。
            }
        });


解决方案

呵呵。你认为。只是N /你的记录数的说法(S)将被创造出来的?

假设:
如果你有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 不正确。

确定。让我告诉你有关解决方案。

 如果(convertView == NULL){
   //你只是findView和视图设置
   // viewHolder =新ViewHolder();
   // viewHolder.yourBtn = convertView.findViewById(R.id.some_view_id);
   // convertView.setTag(viewHolder);
}其他{
   //就在这里,你会得到viewHolder,因为convertView不为空。这意味着viewHolder是存在的。
}

和就在这里,它的意思是你每次都会设定数据的时间(你不会缓存数据,只是缓存VIEW)

假设你的数据是一个对象,对象有哪些代表按钮状态属性。

  MyObject的{
  布尔objStatus;
}

当你设置数据

  viewHolder.yourBtn.setEnable(instanceOfMyObject.objStatus);

Im trying to lock button after user click button on costume list. the item of list fetched from hayoola and then i use viewholder to show data to user in list. if user click accept or refuse button. the result will be passed to hayoola and the selected button will be disabled Problem is after user click button wrong button getting disable. and after five click all remaining button getting disable too.

here is my adapter code :

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

解决方案

Hehe. Do you think that. Just "n/number of your records" view(s) will be created?

Assume that: If you have 100 records and 10 rows will be draw.

And 10 rows won't re-draw.

Button accept of row 1 is disabled that mean Button accept of row 11 + n is the same. :D

May be that's your problem.

And Please read this:

Let I tell you something about ViewHolder pattern.

When you load data to ListView or GridView or something like these.

If your data has 1000 records, ... The ListView doesn't load 1000 records. It's just load "n records". "n" is number of record which compatible with your screen device.

Example: n = 10.

When you scroll down, The ListView will load more data. In this case, each row (view of row) will re-draw.

And with ListView which has large data, when use scroll up or down, you will see your app will be slow... because view is re-drawing.

And ViewHolder is the pattern which help you solve that problem.

When you use ViewHolder pattern, Just "n" (in this example n = 10) views will be created.

So, In your problem. I can tell you that:

May be you are implemented ViewHolder is incorrect.

OK. Let I tell you about the solution.

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

And right here, It mean every time you will set data (You won't cache data, just cache VIEW)

Assume that Your data is an object and object has property which stand for status of button.

MyObject {
  boolean objStatus;
}

and when you set data

viewHolder.yourBtn.setEnable(instanceOfMyObject.objStatus);

这篇关于错误的项目回报鉴于架onclick事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆