行宽度在Android的recyclerview中滚动时变化

问题描述 投票:0回答:1

[警报对话框内的RecyclerView调用,我尝试在运行时在适配器类的MATCH_PARENT中设置宽度onCreateView

if (binding.root.getLayoutParams ().width == RecyclerView.LayoutParams.MATCH_PARENT)
               binding.root.getLayoutParams ().width = parent.getWidth ()

尝试在onCreateView内部调用,但垂直留有空格。我尝试了SO上存在的所有可能组合,但没有任何效果。

private fun initDialog() {
    if (mAlertDialog == null) {
        val mBuilder = AlertDialog.Builder(this)
        val view1 = layoutInflater.inflate(R.layout.select_itinerary_dialog, null, false)
        val mRecyclerView = view1.findViewById<RecyclerView>(R.id.mRecyclerView)

        mRecyclerView?.adapter = SelectItineraryAdapter(this@AddItineraryActivity)
        val llm = LinearLayoutManager(this@AddItineraryActivity)
        //   llm.isAutoMeasureEnabled = false
        mRecyclerView?.layoutManager = llm
        //mRecyclerView?.layoutManager = LinearLayoutManager(this@AddItineraryActivity)
        mCheckBoxSelectAll = view1.findViewById<CheckBox>(R.id.checkSelctAll)
        mCheckBoxSelectAll?.setOnCheckedChangeListener { _, b ->

            if (!fromBroadcastReceiver) {
                for (item in mItinerarylistResponse?.data?.itinerary!!) {
                    item?.isSelected = b
                }
                mRecyclerView?.adapter!!.notifyDataSetChanged()
            }
            fromBroadcastReceiver = false

        }

        view1.findViewById<AppCompatButton>(R.id.clearItinerary).setOnClickListener {

            mAlertDialog!!.dismiss()
        }
        view1.findViewById<AppCompatButton>(R.id.doneItinerary).setOnClickListener {

            try {
                for (item in mItinerarylistResponse?.data?.itinerary!!) {

                    viewContainer.visibility = View.VISIBLE
                    if (item!!.item == "Wake Up") {

                        if (item.isSelected) {
                            wakeUpTimeTV.visibility = View.VISIBLE
                            wakeUpTimeLay.visibility = View.VISIBLE
                        } else {
                            wakeUpTimeTV.visibility = View.GONE
                            wakeUpTimeLay.visibility = View.GONE }
                    }
                }
            } catch (e: Exception) {
            }
            mAlertDialog!!.dismiss()
        }

        mBuilder.setView(view1)
        mAlertDialog = mBuilder.create()
        mAlertDialog?.window?.setBackgroundDrawableResource(android.R.color.transparent)
        //  mAlertDialog?.setView(view1)
    }
}

适配器

class SelectItineraryAdapter(val contecx: AddItineraryActivity) : RecyclerView.Adapter<SelectItineraryAdapter.MyHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {


        val binding = DataBindingUtil.inflate<RowItemItinararyBinding>(LayoutInflater.from(contecx), R.layout.row_item_itinarary, parent, false)
        // val v=  LayoutInflater.from(contecx).inflate(LayoutInflater.from(contecx), R.layout.row_item_itinarary, parent, false)

        /* if (binding.root.getLayoutParams ().width == RecyclerView.LayoutParams.MATCH_PARENT)
           binding.root.getLayoutParams ().width = parent.getWidth ()*/

        val dd = MyHolder(binding)
        return dd
    }

    override fun getItemCount(): Int {
        return mItinerarylistResponse?.data?.itinerary!!.size
    }

    @SuppressLint("ClickableViewAccessibility")
    override fun onBindViewHolder(holder: MyHolder, position: Int) {

        holder.v.itinararyname.text = mItinerarylistResponse?.data?.itinerary!![position]?.item

        holder.v.markReadCheck.setOnCheckedChangeListener { _, isChecked ->
            mItinerarylistResponse?.data?.itinerary!![position]!!.isSelected = isChecked
            val receiverIntentDetail = Intent()
            receiverIntentDetail.action = isitinerarySelected
            holder.v.markReadCheck.context.sendBroadcast(receiverIntentDetail)
        }

        holder.v.detailLat.setOnTouchListener { view, motionEvent ->
            when (motionEvent.action) {
                MotionEvent.ACTION_DOWN -> {

                    com.socrpro.utils.error("ACTION_DOWN")
                }
                MotionEvent.ACTION_UP -> {
                    // if (itinerary[position].readStatus == 0) {
                    holder.v.markReadCheck.performClick()
                    //  }
                    com.socrpro.utils.error("ACTION_UP")
                }
                MotionEvent.ACTION_MOVE -> {
                    com.socrpro.utils.error("ACTION_MOVE")
                }
            }

            true
        }
        holder.v.markReadCheck.isChecked = mItinerarylistResponse?.data?.itinerary!![position]!!.isSelected
    }

    class MyHolder(val v: RowItemItinararyBinding) : RecyclerView.ViewHolder(v.root)
}

行项目

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <RelativeLayout

        android:id="@+id/detailLat" android:layout_width="match_parent" android:layout_height="wrap_content"
        android:clickable="true" android:orientation="vertical">

        <LinearLayout android:id="@+id/readornot" android:layout_width="match_parent"
            android:layout_height="@dimen/_25sdp" android:background="@color/white"
            android:gravity="center_vertical" android:orientation="horizontal"
            android:paddingTop="@dimen/_5sdp" android:paddingBottom="@dimen/_5sdp">

            <CheckBox android:id="@+id/markReadCheck" android:layout_width="wrap_content"
                android:layout_height="wrap_content" android:button="@drawable/custom_checkbox" android:layoutDirection="rtl"
                android:text="" />
            <TextView android:id="@+id/itinararyname" android:layout_width="0dp"
                android:layout_height="wrap_content" android:layout_gravity="center_vertical"
                android:layout_marginStart="@dimen/_2sdp" android:layout_marginEnd="@dimen/_5sdp"
                android:layout_weight="1" android:singleLine="true"
                android:text="dfgdgfdggfdg" android:textColor="@color/colorPrimary"
                android:textSize="@dimen/_10sdp" />

        </LinearLayout>

        <View android:layout_width="match_parent" android:layout_height=".5dp"
            android:layout_alignBottom="@+id/readornot" android:background="@color/linecolorcc" />

    </RelativeLayout>
</layout>

enter image description here

java android android-recyclerview android-alertdialog
1个回答
1
投票

已编辑。.添加新的可能的方法来解决此问题。.

TL; DR

RelativeLayout替换了垂直的LinearLayout(围绕RecyclerView)

方法1(旧答案)

使用ScrollView

包围布局之前>

enter image description here

将ScrollView添加为root之后

enter image description here

样本代码

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

 <ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
                android:id="@+id/search"
                android:layout_width="300dp"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"/>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/search"
                android:orientation="vertical">

                <!--Header-->
                <LinearLayout
                    android:id="@+id/static_header"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    style="@style/HeaderStyle"/>

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/rv"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>
            </LinearLayout>

    </RelativeLayout>
 </ScrollView>
</layout>

添加ScrollView的缺点是,它会使所有包围的视图都滚动!因此,请尝试下一种方法

方法2

(更好的一种)

实际上,我对上一个答案不满意,因为当用户向下滚动RecyclerView时,表的标题不应该消失!所以我只是用RelativeLayout

替换了垂直的[[LinearLayout(围绕RecyclerView)样本代码

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/search" android:layout_width="300dp" android:layout_height="wrap_content" android:layout_alignParentEnd="true"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/search"> <!--Header--> <LinearLayout android:id="@+id/static_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignStart="@id/rv" android:layout_alignEnd="@id/rv" style="@style/HeaderStyle"/> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/static_header"/> </RelativeLayout> </RelativeLayout> </layout>

© www.soinside.com 2019 - 2024. All rights reserved.