RecyclerView遇到的两个bug

问题1

出现match_parent、margin无效的情况

LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.item_body, parent, false);

问题2

使用增删item时,为了动画效果,不能使用notifyDataSetChanged,而是采用 notifyItemInserted(position);和 notifyItemRemoved(position);如果用形参里的position,导致变化后的条目在UI的位置与其本身索引不对应的问题

//使用getLayoutPosition,而不是形参里的position
 int pos = holder.getLayoutPosition();
package com.anew.recyclerviewall;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;
import java.util.Random;

/**
 * Created by a on 2017/1/7.
 */
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.VH> {
    private Context context;
    private List<String> list;

    public MyAdapter(Context context, List<String> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public VH onCreateViewHolder(ViewGroup parent, int viewType) {
//        ★建议用这种方法加载布局,否则会出现match_parent、margin无效的情况,还得保证recyclerView宽高不是wrap_content
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.item_body, parent, false);
//         采用以下方式,会match_parent无效
//        View view = View.inflate(context, R.layout.item_body, null);
        return new VH(view);
    }

    @Override
    public void onBindViewHolder(final VH holder, final int position) {
        holder.mTv.setText(list.get(position));
        ViewGroup.LayoutParams params = holder.mLl.getLayoutParams();

//        setItemRandomHeight(holder, params);

        holder.mTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                ★一定要是使用holder.getLayoutPosition来获取新的position
//                这能保证你当前点击的item的索引值是正确的
//                不然如果你想使用item的animation效果,又不能使用notifyDataSetChanged更新
//                数据时(使用了他会失去动画效果),而是使用了notifyItemInserted(pos)
//                通知更新数据,之后,你还是用普通的position时,你会发现这个item的索引和
//                其在ui上的位置并不一致,这是必须使用holder.getLayoutPosition()了
                int pos = holder.getLayoutPosition();
                int adapterPosition = holder.getAdapterPosition();
                int layoutPosition = holder.getLayoutPosition();
                int oldPosition = holder.getOldPosition();
                int positionp = holder.getPosition();

//                事实证明adapterPosition=layoutPosition=positionp
//                oldPosition永远等于-1
//                普通的position在没有notifyDataSetChanged之前是原来列表的索引值

//                所以在设置点击事件时(或者你用回调把点击事件写在外面),传入
//                layoutPosition是妥当的,而不是传入形参里带来的position
                Log.e("eee", "adapterPosition: "+adapterPosition);
                Log.e("eee", "layoutPosition: "+layoutPosition);
                Log.e("eee", "oldPosition: "+oldPosition);
                Log.e("eee", "positionp: "+positionp);
                Log.e("eee", "position: "+position);
//                addData(3);
                removeData(pos);
                Toast.makeText(context,adapterPosition+"",Toast.LENGTH_SHORT).show();
            }

        });
    }

//    item高度随机设置
    private void setItemRandomHeight(VH holder, ViewGroup.LayoutParams params) {
        int height = new Random().nextInt(4)*90+90;
        params.height= height;
        holder.mLl.setLayoutParams(params);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public void addData(int position) {
        list.add(position, "Insert One");
//       ★★★★ 使用notifyItemInserted去更新数据,否则没有动画效果
        notifyItemInserted(position);
    }

    public void removeData(int position) {
//        ★★★★
        list.remove(position);
        notifyItemRemoved(position);
        }
    class VH extends RecyclerView.ViewHolder {

        private TextView mTv;
        private LinearLayout mLl;

        public VH(View itemView) {
            super(itemView);
            mTv = (TextView) itemView.findViewById(R.id.tv);
            mLl = (LinearLayout) itemView.findViewById(R.id.ll);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值