【问题标题】:Condition not working properly inside getView in BaseAdapter?在 BaseAdapter 的 getView 内条件无法正常工作?
【发布时间】:2017-01-16 10:39:36
【问题描述】:

我的应用程序中有一个ListView 来显示记录列表。我有一个Button 和一些RadioButton,它们需要根据某些条件可见或不可见。当列表滚动时,最后一个视图变为重复,并且条件无法正常工作。发生了什么,我该如何解决?

public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    ViewHolder holder = null;

    if (convertView == null) {

        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.approval_list, null);

        //<<<<<<<<<<<<<<<<<<<Initialization of ListView Components 
        //holder.indivListvLayout = (LinearLayout)convertView.findViewById(R.id.indRevLayout);
         holder.tv_com_title = (TextView) convertView.findViewById(R.id.tv_com_title);
         holder.tv_designation = (TextView) convertView.findViewById(R.id.tv_designation);
         holder.et_commnents = (EditText) convertView.findViewById(R.id.et_commnents);
         holder.rb_rev = (RadioButton) convertView.findViewById(R.id.rb_rev);
         holder.rb_rej = (RadioButton) convertView.findViewById(R.id.rb_rej);
         holder.btn_modify = (Button) convertView.findViewById(R.id.btn_modify);
                        //>>>>>>>>>>>>>>>>>>End Initialization

                        //<<<<<<<<<<<<<<<<<<Make visible radio button according to user_group code
         //List User Group Code
         String user_group_code = mDisplayedValues.get(position).user_group_code;
         //Log.e("User Group code from list", user_group_code);
         if("RO".equals(user_group_code)){
            holder.rb_app_recom.setVisibility(View.VISIBLE);
         }else if("RM".equals(user_group_code)){
            holder.rb_app_recom.setVisibility(View.VISIBLE);
         }else("BDM".equals(user_group_code)){
            holder.rb_app_recom.setVisibility(View.VISIBLE);
            holder.rb_rej_req.setVisibility(View.VISIBLE);
         }

                        //<<<<<<<<<<<<<<<<<<Selection of radio button according to flag
         //Getting flag value
         String approve_flag = mDisplayedValues.get(position).approve_flg;

         if(approve_flag.equals("A")){
            holder.rb_approved.setChecked(true);
         }else (approve_flag.equals("R")){
            holder.rb_rev.setChecked(true);
         }
         //>>>>>>>>>>>>>>>>>>>End selecting radio button

                        //<<<<<<<<<<<<<<<<<<<Make radio button click able
         //String user_group_code2 = user_session_sp.getString("user_group_code", " ");
         if(user_group_code2.equals(mDisplayedValues.get(position).user_group_code)){
            holder.rb_approved.setClickable(true);
            holder.rb_rev.setClickable(true);
         }else{
            holder.rb_approved.setClickable(false);
            holder.rb_rev.setClickable(false);
         }
         //>>>>>>>>>>>>>>>>>>>End selecting radio button clekcable Setting
         convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.tv_com_title.setText(mDisplayedValues.get(position).groucode +" "+ mDisplayedValues.get(position).comments_by+" "+ mDisplayedValues.get(position).designation);
    holder.tv_designation.setText(mDisplayedValues.get(position).user_group_code);
    holder.et_commnents.setText(mDisplayedValues.get(position).comments);

    return convertView;
}   

【问题讨论】:

  • 在 if-else 循环之外设置可见性将解决您的问题。
  • 每次滚动视图时,在 ListView 视图中渲染。在这里,您使用了视图持有者模式,因此它将重用相同的视图,因此不会改变可见性。
  • 'if-else' 是循环吗? @Dhaval Patel
  • 如果视图持有者重复使用相同的视图是否意味着视图不会被新数据替换?这是否意味着滚动列表后会显示相同的数据?

标签: android listview baseadapter


【解决方案1】:

像这样试试。

问题是您的条件语句仅针对第一项执行(convertedview 为 null 时的初始化时间),否则将不会执行。

 public View getView(final int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            ViewHolder holder = null;

            if (convertView == null) {

                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.approval_list, null);

                //<<<<<<<<<<<<<<<<<<<Initialization of ListView Components 
                //holder.indivListvLayout = (LinearLayout)convertView.findViewById(R.id.indRevLayout);
                holder.tv_com_title = (TextView) convertView.findViewById(R.id.tv_com_title);
                holder.tv_designation = (TextView) convertView.findViewById(R.id.tv_designation);
                holder.et_commnents = (EditText) convertView.findViewById(R.id.et_commnents);
                holder.rb_rev = (RadioButton) convertView.findViewById(R.id.rb_rev);
                holder.rb_rej = (RadioButton) convertView.findViewById(R.id.rb_rej);
                holder.btn_modify = (Button) convertView.findViewById(R.id.btn_modify);
                //>>>>>>>>>>>>>>>>>>End Initialization

                //>>>>>>>>>>>>>>>>>>>End selecting radio button clekcable Setting
                    convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            //<<<<<<<<<<<<<<<<<<Make visible radio button according to user_group code
                //List User Group Code
                String user_group_code = mDisplayedValues.get(position).user_group_code;
                //Log.e("User Group code from list", user_group_code);
                if("RO".equals(user_group_code)){
                    holder.rb_app_recom.setVisibility(View.VISIBLE);
                }else if("RM".equals(user_group_code)){
                    holder.rb_app_recom.setVisibility(View.VISIBLE);
                }else("BDM".equals(user_group_code)){
                    holder.rb_app_recom.setVisibility(View.VISIBLE);
                    holder.rb_rej_req.setVisibility(View.VISIBLE);
                }

                //<<<<<<<<<<<<<<<<<<Selection of radio button according to flag
                //Getting flag value
                String approve_flag = mDisplayedValues.get(position).approve_flg;

                if(approve_flag.equals("A")){
                    holder.rb_approved.setChecked(true);
                }else (approve_flag.equals("R")){
                    holder.rb_rev.setChecked(true);
                }
                //>>>>>>>>>>>>>>>>>>>End selecting radio button

                //<<<<<<<<<<<<<<<<<<<Make radio button click able
                //String user_group_code2 = user_session_sp.getString("user_group_code", " ");
                if(user_group_code2.equals(mDisplayedValues.get(position).user_group_code)){
                    holder.rb_approved.setClickable(true);
                    holder.rb_rev.setClickable(true);
                }else{
                    holder.rb_approved.setClickable(false);
                    holder.rb_rev.setClickable(false);
                }

            holder.tv_com_title.setText(mDisplayedValues.get(position).groucode +" "+ mDisplayedValues.get(position).comments_by+" "+ mDisplayedValues.get(position).designation);
            holder.tv_designation.setText(mDisplayedValues.get(position).user_group_code);
            holder.et_commnents.setText(mDisplayedValues.get(position).comments);

          return convertView;
        }   

【讨论】:

  • 我已经应用了所有条件 if (convertView == null) {convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); }。但我没有发现任何变化。
  • 是的,那么只有那些条件对每一行执行
  • 查看您的代码目前所有条件都在if(convertedView == null){}块内
  • 我说............我第一次应用了 if(convertedView == null){} 之外的所有条件。然后当它显示问题时,我把它放在里面。所以内外都不起作用..
  • 调试看看你是否从mDisplayedValues得到正确的数据,否则一切都很好
【解决方案2】:

在使用视图模式时,您必须处理各种情况:

if(approve_flag.equals("A")){
   holder.rb_approved.setChecked(true);
else {
   holder.rb_approved.setChecked(false);
}
if (approve_flag.equals("R")){
   holder.rb_rev.setChecked(true);
}
else {
   holder.rb_rev.setChecked(false);
}

【讨论】:

  • if(condition){}else{} if(condition){}else{} 和 if(condition){}else if(condition)(condition){}else{ 有什么区别}
【解决方案3】:

ViewHolder 模式中,只有if 语句会导致意外结果

所以更好用,ifelse

示例:

if(condition){
   //special execution
}else{
   //default execution
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    相关资源
    最近更新 更多