【问题标题】:getting wrong position for Item clicked in grid view在网格视图中单击的项目位置错误
【发布时间】:2016-10-25 11:36:57
【问题描述】:

我正在使用网格视图,并在每个网格单元格中显示相机预览,TextViewLinearLayout。我希望当我点击LinearLayout 时,它的可见性应该消失,只有TextView 应该可见。它工作正常,但有时我遇到问题。假设现在只有两个单元格可见,当我单击单元格 1 的 LinearLayout 时,它应该消失了,但单元格 2 的 LinearLayout 却消失了。

   public View getView(int position, View convertView, ViewGroup parent) {
        Log.d(LOG_TAG,"vikash: gridView Position position: "+position);
        final CameraItem camera = getItem(position);

        if(convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = (LinearLayout)inflater.inflate(R.layout.camera_cell, null);
        }
        final int mlayoutPosition;
        mlayoutPosition=position;       
        final LinearLayout motionLayout = (LinearLayout)convertView.findViewById(R.id.motion_details);

            final TextView name = (TextView)convertView.findViewById(R.id.name);
            motionLayout.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v) {
                    camera.ignoreMotionFault();
                    motionLayout.setVisibility(LinearLayout.GONE);
                    Log.d(LOG_TAG,"vikash: motionlayout visibility gone for position: "+mlayoutPosition);
                    name.setVisibility(TextView.VISIBLE);
                }
            });
          return convertView;
}

【问题讨论】:

    标签: android android-layout gridview adapter


    【解决方案1】:

    不要在clicklistener中使用mlayoutposition变量,使用position变量并在getView方法参数中使position变量final

    public View getView(final int position, View convertView, ViewGroup parent) {
        Log.d(LOG_TAG, "vikash: gridView Position position: " + position);
        final CameraItem camera = getItem(position);
    
        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = (LinearLayout) inflater.inflate(R.layout.camera_cell, null);
        }
        final int mlayoutPosition;
        mlayoutPosition = position;
        final LinearLayout motionLayout = (LinearLayout) convertView.findViewById(R.id.motion_details);
    
        final TextView name = (TextView) convertView.findViewById(R.id.name);
        motionLayout.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                camera.ignoreMotionFault();
                motionLayout.setVisibility(TextView.GONE);
                Log.d(LOG_TAG, "vikash: motionlayout visibility gone for position: " + position);
                name.setVisibility(TextView.VISIBLE);
            }
        });
        return convertView;
    }
    

    onClickListener 方法中的简单一行:

    mlayoutPosition = position;

        motionLayout.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mlayoutPosition = position; // get latest position
                camera.ignoreMotionFault();
                motionLayout.setVisibility(TextView.GONE);
                Log.d(LOG_TAG, "vikash: motionlayout visibility gone for position: " + position);
                name.setVisibility(TextView.VISIBLE);
            }
        });
    

    【讨论】:

    • mlayoutPosition 不是问题。我已添加仅查看日志。我的问题是当我单击第一个单元格的motionLayout(网格视图中的第0 个位置)时,第二个单元格的motionLayout 的可见性消失了。根据第一个单元格的motionLayout的逻辑可见性应该消失
    【解决方案2】:

    尝试将可见性设置为 LinearLayout.GONE 而不是 textView.Gone

    【讨论】:

    • LinearLayout.GONE 和 TextView.GONE 具有相同的值,即 8。所以这不是问题
    【解决方案3】:

    尝试使用下面的:-

    public View getView(int position, View convertView, ViewGroup parent) {
            Log.d(LOG_TAG,"vikash: gridView Position position: "+position);
           CameraItem camera = getItem(position);
            ViewHolder viewHolder=null;
            if(convertView == null) {
                LayoutInflater inflater = LayoutInflater.from(getContext());
                convertView = (LinearLayout)inflater.inflate(R.layout.camera_cell, null);
                 viewHolder=new ViewHolder();
                 viewHolder.motionLayout= (LinearLayout)convertView.findViewById(R.id.motion_details);
                 viewHolder.name = (TextView)convertView.findViewById(R.id.name);
                 convertView.setTag(viewHolder);
            }else{
                 viewHolder=(ViewHolder)convertView.getTag();
             }
            // if you want to get position on click of that view set tag position to that view
        viewHolder.motionLayout.setTag(viewHolder);
                viewHolder.motionLayout.setOnClickListener(new OnClickListener(){
                    @Override
                    public void onClick(View v) {
                        camera.ignoreMotionFault();
                        ViewHolder view_holder=(ViewHolder)v.getTag();
                        view_holder.motionLayout.setVisibility(LinearLayout.GONE);
                        view_holder.name.setVisibility(TextView.VISIBLE);
                    }
                });
              return convertView;
    }
    
    public class ViewHolder{
    LinearLayout motionLayout;
    TextView name;
    }
    

    使用 ViewHolder 并通过标签使用以前的视图并使用标签获取视图的位置

    【讨论】:

    • 据我所知 ViewHolder 模式用于平滑滚动。在我的情况下,滚动不是问题。我的问题是当我单击第一个单元格的motionLayout(网格视图中的第0 个位置)时,第二个单元格的motionLayout 的可见性消失了。根据第一个单元格的motionLayout的逻辑可见性应该消失
    • 尝试使用 v.setVisibility(LinearLayout.GONE);而不是 motionLayout.setVisibility(LinearLayout.GONE);
    • 或者借助viewHolder,将viewHolder设置为motionLayout的标签,并通过该获取标签设置set Visiblity可见或消失。查看编辑后的代码
    • 好的,但我更喜欢你的 ViewHolder
    • motionLayout.setTag(position); ---------------- public void onClick(View v) { Integer pos = (Integer)v.getTag(); camera.ignoreMotionFault(); v.setVisibility(LinearLayout.GONE); Toast.makeText(getContext(), "标签位置:"+pos+" 位置:"+position, Toast.LENGTH_SHORT).show(); name.setVisibility(TextView.VISIBLE); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多