代码之家  ›  专栏  ›  技术社区  ›  noone000

我是否正确使用ViewHolder?所有这些都是有效的,但我仍然对holder recycler的ListView优化表示怀疑

  •  0
  • noone000  · 技术社区  · 7 年前

    我只是在用ViewHolder修改我的自定义适配器代码,以便用回收器优化我的列表视图,但我不确定我是否做对了。

    我的视图持有者类别:

    public class ViewHolderTask {
    int positionHolder;
    TextView nameHolder;
    TextView timeHolder;
    TextView sessionHolder;
    TextView dateHolder;
    FloatingActionButton mFabTaskHolder;
    
    public ViewHolderTask(View v, int position) {
        this.positionHolder = position;
        this.nameHolder = v.findViewById(R.id.taskNameText);
        this.timeHolder = v.findViewById(R.id.timeTextView);
        this.sessionHolder = v.findViewById(R.id.textViewSession);
        this.dateHolder = v.findViewById(R.id.dateTextView);
        this.mFabTaskHolder = v.findViewById(R.id.myFabTask);
    }
    

    我的自定义适配器类:

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewHolderTask holder;
        if(convertView == null){
    
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE );
            convertView = inflater.inflate(R.layout.task_row, parent, false);
            holder = new ViewHolderTask(convertView, position);
            convertView.setTag(holder);
    
        }else{
            holder = (ViewHolderTask) convertView.getTag();
        }
        Task task = taskArrayList.get(position);
        //set the configurations
        holder.getTimeHolder().setText(getTimeString(task.getTime()));
        holder.getNameHolder().setText(task.getName());
        holder.getDateHolder().setText(getDateString(task.getDate()));
        holder.getSessionHolder().setText(getSessionString(task.getSession()));
        //Set the FAB listener
        addFabListener(holder.getmFabTaskHolder(), position);
    
        //set the clicked background
        if(TaskActivity.getIsClicked() && TaskActivity.getPositionClicked()-1 == position){
            convertView.setBackgroundResource(R.color.backgroundSelectedItem);
        }
    
        return convertView;
    }
    

    我用对了吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   lib4backer    7 年前

    除了代码的这一部分之外,对我来说似乎没什么问题

      //set the clicked background
        if(TaskActivity.getIsClicked() && TaskActivity.getPositionClicked()-1 == position){
            convertView.setBackgroundResource(R.color.backgroundSelectedItem);
        }
    

    您可能需要将未单击的项目的后台资源重置回默认值。也许你必须在“如果”中加上“其他”部分