OnClick事件与listview项重复 [英] OnClick event repeats with listview items

查看:121
本文介绍了OnClick事件与listview项重复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序中有一个列表视图.每个listview行在点击时都会展开,并且隐藏视图变为可见,但是问题在于隐藏视图对于列表中的许多其他项目也变得可见.我知道此行为的原因,但我不知道如何解决.这是我的适配器类

I am having a listview in my app. Each listview row expands on tap and a hidden view becomes visible but problem is that hidden view also becomes visible for many others items in the list. I know the reason for this behaviour but I don't know how to resolve it. Here is my adapter class

 public class ScheduleTaskAdapter extends BaseAdapter {
    Context context;
    LayoutInflater layoutInflater;
    // List<InterestAndLanguageBean> interestAndLanguageBeans=new ArrayList<>();
    List<BirdsDataBean> imageList = new ArrayList<>();

    public ScheduleTaskAdapter(Context context, List<BirdsDataBean> imagesList) {
        this.context = context;
        this.imageList = imagesList;
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return imageList.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.birds_row, parent, false);
            holder.iv_birds = (ImageView) convertView.findViewById(R.id.iv_bird);
            holder.frameLayout = (FrameLayout) convertView.findViewById(R.id.frame_birds);
            holder.linearLayout = (LinearLayout) convertView.findViewById(R.id.detail_view);
            holder.imageView = (ImageView) convertView.findViewById(R.id.up);
            holder.iv_video = (ImageView) convertView.findViewById(R.id.iv_video);
            holder.iv_sound = (ImageView) convertView.findViewById(R.id.iv_sound);
            holder.tv_short_descript = (TextView) convertView.findViewById(R.id.tv_short_descript);
            holder.tv_category = (TextView) convertView.findViewById(R.id.tv_category);
            holder.tv_long_description = (TextView) convertView.findViewById(R.id.tv_long_description);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        Uri myUri = Uri.parse(birdsUrlList.get(position).getUrl());
        Glide.with(getActivity()).load(myUri).placeholder(R.drawable.birds).into(holder.iv_birds);
        holder.tv_short_descript.setText(birdsUrlList.get(position).getDescrip());
        holder.tv_long_description.setText(birdsUrlList.get(position).getDescrip_larga());
        holder.tv_category.setText(birdsUrlList.get(position).getNombre_cientifico());
        final ViewHolder finalHolder = holder;
        holder.frameLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalHolder.linearLayout.setVisibility(View.VISIBLE);
                finalHolder.iv_sound.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        try {
                            MediaPlayer mp = new MediaPlayer();
                                mp.setDataSource(birdsUrlList.get(position).getUrl_audio());
                                mp.prepare();
                            mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                                @Override
                                public void onPrepared(MediaPlayer mp) {
                                    mp.start();
                                }
                            });
                            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                                @Override
                                public void onCompletion(MediaPlayer mp) {
                                    mp.release();
                                }
                            });
                            //startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(birdsUrlList.get(position).getUrl_video())));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
                finalHolder.iv_video.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        hitBirdSeenService(birdsUrlList.get(position).getIdave());
                        finalHolder.iv_video.setImageResource(R.drawable.eye_selected);
                    }
                });
            }
        });
        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalHolder.linearLayout.setVisibility(View.GONE);
            }
        });
        if (birdsUrlList.get(position).getFlag()==1)
        {
            holder.iv_video.setImageResource(R.drawable.eye_selected);
        }else {
            holder.iv_video.setImageResource(R.drawable.eye110);
        }
        //Picasso.with(context).load(myUri).placeholder(R.drawable.image).into(holder.pic);
        //malevich.load(helperTaskBeanList.get(position).getImage()).into(holder.pic);
        return convertView;
    }

}

推荐答案

ListView项是可重用的.滚动列表时,某些项目变为不可见",并且视图项目将重新用于将变为可见的项目.

ListView items are reusable. When you scroll the list, some items becomes "invisible" and the view item will be reused for the one that will become visible.

您不会保留要展开的项和不展开的项的数据,因此您无法根据getView方法中先前的展开"状态将展开"部分的可见性设置为GONE或VISIBLE.一个简单的解决方法是在扩展put(position,true)并隐藏put(position,false)时制作一个Map<Integer,Boolean>并将状态保留在此处.在getView

You do not keep the data of which item is expanded and which do not, so you cannot set the visibility to GONE or VISIBLE for "expanded" part depending on its previous "expanded" state in getView method. Simple workaround is to make a Map<Integer,Boolean> and keep the state here, when expanding put(position,true) and on hide put(position,false). In getView

boolean state = expandedStateMap.get(position);
finalHolder.linearLayout.setVisibility((state) ? View.VISIBLE : View.GONE);

步骤零(为展开状态添加地图)

Step zero (adding map for expanded state)

public class ScheduleTaskAdapter extends BaseAdapter {
    Context context;
    LayoutInflater layoutInflater;
    // List<InterestAndLanguageBean> interestAndLanguageBeans=new ArrayList<>();
    List<BirdsDataBean> imageList = new ArrayList<>();
    Map<Integer,Boolean> expandedStateMap = new HashMap<>();

第一步:

    //determine if we already expanded the item
    Boolean state = expandedStateMap.get(position);
    if (state == null) {
      state = false;
    }
    finalHolder.linearLayout.setVisibility((state) ? View.VISIBLE :      View.GONE);

    holder.frameLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //save expanded state 
                expandedStateMap.put(position,true);
                finalHolder.linearLayout.setVisibility(View.VISIBLE);

第二步:

 holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 expandedStateMap.put(position,false);
                finalHolder.linearLayout.setVisibility(View.GONE);
            }
        });

这篇关于OnClick事件与listview项重复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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