Android 编写踩坑自记录

本文记录了在Android开发中遇到的三个问题:1.使用自定义RecyclerView.Adapter时无法显示内容,原因是传入的上下文对象错误;2.TextView设置高度无效,可能是XML布局与代码设置冲突;3.TextView设置长按复制功能的实现。

RecyclerView 使用自定义的RecyclerView.Adapter之后无法显示

androidx.recyclerview.widget.RecyclerView

代码; 代码都是复制别人的;别人的就能跑为什么自己的就是没有办法执行呢?是不是很纳闷;…下面代码是复制的代码;别人就能跑;我的就不能…


	private RecyclerView recycleView;

    private RecyclerViewAdapter recyclerViewAdapter;
	private List<String> locationCodeList;
    private List<String> positionList;
    private List<String> numberList;

 	public void init(){
		 recycleView = findViewById(R.id.recycle_view);
        recyclerViewAdapter = new RecyclerViewAdapter();
        recycleView.setAdapter(recyclerViewAdapter);
        // 注意此处 传入的参数值   this
        recycleView.setLayoutManager(new LinearLayoutManager(this));
           // 注意此处 传入的参数值   this
        recycleView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
	}



    class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
        @Override
        public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //  当不显示的时候注意此   LayoutInflater.from(getContext()) 这个参数的传值是否正确的上下文
            RecyclerViewAdapter.MyViewHolder holder = new RecyclerViewAdapter.MyViewHolder(LayoutInflater.from(getContext()).inflate(R.layout.activity, parent, false));
            return holder;
        }
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            holder.code.setText(locationCodeList.get(position));
            holder.position.setText(positionList.get(position));
            holder.number.setText(numberList.get(position));
        }
        @Override
        public int getItemCount() {
            return locationCodeList.size();
        }
        class MyViewHolder extends RecyclerView.ViewHolder {
            TextView code;
            TextView position;
            TextView number;

            private MyViewHolder(View view) {
                super(view);
                code = view.findViewById(R.id.code);
                position = view.findViewById(R.id.position);
                number = view.findViewById(R.id.number);
            }
        }
    }

结果图 :

其实是有数据的

修改后代码;可以执行

	private RecyclerView recycleView;

    private RecyclerViewAdapter recyclerViewAdapter;
	private List<String> locationCodeList;
    private List<String> positionList;
    private List<String> numberList;

 	public void init(){
		 recycleView = findViewById(R.id.recycle_view);
        recyclerViewAdapter = new RecyclerViewAdapter();
        recycleView.setAdapter(recyclerViewAdapter);
        // 注意此处 传入的参数值   this
        recycleView.setLayoutManager(new LinearLayoutManager(this));
           // 注意此处 传入的参数值   this
        recycleView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
	}

    class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
        @Override
        public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // =====================注意此处的参数传值   getLayoutInflater()  
            RecyclerViewAdapter.MyViewHolder holder = new   RecyclerViewAdapter.MyViewHolder(getLayoutInflater().inflate(R.layout.activity, parent, false));
            return holder;
        }
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            holder.code.setText(locationCodeList.get(position));
            holder.position.setText(positionList.get(position));
            holder.number.setText(numberList.get(position));
        }
        @Override
        public int getItemCount() {
            return locationCodeList.size();
        }
        class MyViewHolder extends RecyclerView.ViewHolder {
            TextView code;
            TextView position;
            TextView number;

            private MyViewHolder(View view) {
                super(view);
                code = view.findViewById(R.id.code);
                position = view.findViewById(R.id.position);
                number = view.findViewById(R.id.number);
            }
        }
    }

结果图

实际图

主要是传入上下文的时候;传入的对象错误; 所以需要检查入参的上下文对象

		 // 注意此处 传入的参数值   this
        recycleView.setLayoutManager(new LinearLayoutManager(this));
           // 注意此处 传入的参数值   this
        recycleView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); 
    // =====================注意此处的参数传值   getLayoutInflater()  
            RecyclerViewAdapter.MyViewHolder holder = new   RecyclerViewAdapter.MyViewHolder(getLayoutInflater().inflate(R.layout.activity, parent, false));
            

TextView 设置高度不起效

期望 :

如下图所示; xml中写了规定的 layout_height; 希望通过代码 改变当前的固定高度

<TextView
        android:id="@+id/position"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:layout_weight="1"
        android:gravity="center"
        android:text="" />

实现

//传入需要修改的 TextView  对象
 private void setLayoutParams(@NonNull TextView textView) {
            ViewGroup.LayoutParams layoutParams = textView.getLayoutParams();
            //获取 固定的高度; 设置你想添加的高度; 也可以根据字体大小自适应 android.view.ViewGroup.LayoutParams#MATCH_PARENT
            layoutParams.height = layoutParams.height + 60;
            textView.setLayoutParams(layoutParams);
        }

注 :

/**
     * Sets the height of the TextView to be exactly <code>pixels</code> tall.
     * <p>
     * //没有设置固定高度的情况下有作用
     * This value is used for height calculation if LayoutParams does not force TextView to have an
     * exact height. Setting this value overrides previous minimum/maximum height configurations
     * such as {@link #setMinHeight(int)} or {@link #setMaxHeight(int)}.
     *
     * @param pixels the exact height of the TextView in terms of pixels
     *
     * @see #setLines(int)
     *
     * @attr ref android.R.styleable#TextView_height
     */
     //设置此高度无效;因为我们已经在xml中设置了固定的 高度
          textView.setHeight(25);

TextView 设置长按复制

//设置可以被选中
android:textIsSelectable="true"

添加图

长按或者双加效果
效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值