亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

老師,我遇到了一個非常奇葩的問題,recyclerview 中的item match_parent不起作用!?。?!

//由于我的AS更新到了最細版本,在新建項目的時候沒有選擇compile?version的界面了,默認就是最新的6.0
//下面的是activity_main布局文件
<?xml?version="1.0"?encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout?xmlns:android="http://schemas.android.com/apk/res/android"
????xmlns:app="http://schemas.android.com/apk/res-auto"
????xmlns:tools="http://schemas.android.com/tools"
????android:layout_width="match_parent"
????android:layout_height="match_parent"
????android:fitsSystemWindows="true"
????tools:context=".MainActivity">

????<android.support.design.widget.AppBarLayout
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:theme="@style/AppTheme.AppBarOverlay">

????????<android.support.v7.widget.Toolbar
????????????android:id="@+id/toolbar"
????????????android:layout_width="match_parent"
????????????android:layout_height="?attr/actionBarSize"
????????????android:background="?attr/colorPrimary"
????????????app:popupTheme="@style/AppTheme.PopupOverlay"?/>

????</android.support.design.widget.AppBarLayout>

????<include?layout="@layout/content_main"?/>

????<android.support.design.widget.FloatingActionButton
????????android:id="@+id/fab"
????????android:layout_width="wrap_content"
????????android:layout_height="wrap_content"
????????android:layout_gravity="bottom|end"
????????android:layout_margin="@dimen/fab_margin"
????????android:src="@android:drawable/ic_dialog_email"?/>

</android.support.design.widget.CoordinatorLayout>
//content_main.xml布局文件
<?xml?version="1.0"?encoding="utf-8"?>
<RelativeLayout?xmlns:android="http://schemas.android.com/apk/res/android"
????xmlns:app="http://schemas.android.com/apk/res-auto"
????xmlns:tools="http://schemas.android.com/tools"
????android:layout_width="match_parent"
????android:layout_height="match_parent"
????app:layout_behavior="@string/appbar_scrolling_view_behavior"
????tools:context=".MainActivity"
????tools:showIn="@layout/activity_main">

????<android.support.v7.widget.RecyclerView
????????android:id="@+id/rv"
????????android:layout_width="match_parent"
????????android:layout_height="200dp"></android.support.v7.widget.RecyclerView>
</RelativeLayout>
//item.xml文件
<?xml?version="1.0"?encoding="utf-8"?>
<FrameLayout?xmlns:android="http://schemas.android.com/apk/res/android"
????android:layout_width="match_parent"
????android:layout_height="72dp"
????android:background="#44ff0000">

????<TextView
????????android:id="@+id/tv"
????????android:layout_width="match_parent"
????????android:layout_height="match_parent"
????????android:gravity="center"?/>
</FrameLayout>
//MainActivity代碼
package?com.lee.taylor.recyclerview;

import?android.os.Bundle;
import?android.support.design.widget.FloatingActionButton;
import?android.support.design.widget.Snackbar;
import?android.support.v7.app.AppCompatActivity;
import?android.support.v7.widget.LinearLayoutManager;
import?android.support.v7.widget.RecyclerView;
import?android.support.v7.widget.Toolbar;
import?android.view.View;
import?android.view.Menu;
import?android.view.MenuItem;


import?java.util.ArrayList;
import?java.util.List;

public?class?MainActivity?extends?AppCompatActivity?{
????private?List<String>?mDatas;//數據源
????private?RecyclerView?mRv;

????@Override
????protected?void?onCreate(Bundle?savedInstanceState)?{
????????super.onCreate(savedInstanceState);

????????setContentView(R.layout.activity_main);
????????Toolbar?toolbar?=?(Toolbar)?findViewById(R.id.toolbar);
????????setSupportActionBar(toolbar);

????????FloatingActionButton?fab?=?(FloatingActionButton)?findViewById(R.id.fab);
????????fab.setOnClickListener(new?View.OnClickListener()?{
????????????@Override
????????????public?void?onClick(View?view)?{
????????????????Snackbar.make(view,?"Replace?with?your?own?action",?Snackbar.LENGTH_LONG)
????????????????????????.setAction("Action",?null).show();
????????????}
????????});
????????initDatas();
????????initView();

????????mRv.setAdapter(new?SimpleAdapter(mDatas,?this));
????????LinearLayoutManager?manager?=?new?LinearLayoutManager(this,?LinearLayoutManager.VERTICAL,?true);
????????mRv.setLayoutManager(manager);
????}

????private?void?initView()?{
????????mRv?=?(RecyclerView)?findViewById(R.id.rv);

????}

????private?void?initDatas()?{
????????mDatas?=?new?ArrayList<>();
????????for?(int?i?=?'A';?i?<?'z';?i++)?{
????????????mDatas.add(""?+?(char)?i);
????????}
????}


????@Override
????public?boolean?onCreateOptionsMenu(Menu?menu)?{
????????//?Inflate?the?menu;?this?adds?items?to?the?action?bar?if?it?is?present.
????????getMenuInflater().inflate(R.menu.menu_main,?menu);
????????return?true;
????}

????@Override
????public?boolean?onOptionsItemSelected(MenuItem?item)?{
????????//?Handle?action?bar?item?clicks?here.?The?action?bar?will
????????//?automatically?handle?clicks?on?the?Home/Up?button,?so?long
????????//?as?you?specify?a?parent?activity?in?AndroidManifest.xml.
????????int?id?=?item.getItemId();

????????//noinspection?SimplifiableIfStatement
????????if?(id?==?R.id.action_settings)?{
????????????return?true;
????????}

????????return?super.onOptionsItemSelected(item);
????}
}
//SimpleAdapter
package?com.lee.taylor.recyclerview;

import?android.content.Context;
import?android.support.v7.widget.RecyclerView;
import?android.view.LayoutInflater;
import?android.view.View;
import?android.view.ViewGroup;
import?android.widget.TextView;

import?java.util.List;

/**
?*?Created?by?Taylor?on?2015/10/9.
?*/
public?class?SimpleAdapter?extends?RecyclerView.Adapter<SimpleAdapter.MyViewHolder>?{
????private?List<String>?mDatas;
????private?LayoutInflater?mInflater;

????public?SimpleAdapter(List<String>?mDatas,?Context?context)?{
????????this.mDatas?=?mDatas;
????????this.mInflater?=?LayoutInflater.from(context);
????}

????@Override
????public?MyViewHolder?onCreateViewHolder(ViewGroup?parent,?int?viewType)?{
????????/**
?????????*?此處inflate的時候?,如果是mInflater.inflate(R.layout.listview_item,?parent);會報如下錯誤
?????????*
?????????*?The?specified?child?already?has?a?parent.?You?must?call?removeView()?on?the?child's?parent?first
?????????*
?????????*?它說這個特定的child已經有一個parent了,你必須在這個parent中首先調用removeView()方法,才能繼續你的內容。
?????????*
?????????*?這里很明顯這個child是一個View,一個子(child)View必須依賴于父(parent)View,如果你要使用這個child,
?????????*
?????????*?則必須通過parent,而你如果就是硬想使用這個child,那么就得讓這個child與parent脫離父子關系(即removeView())
?????????*/
????????View?convertView?=?mInflater.inflate(R.layout.listview_item,?null);
????????MyViewHolder?viewHolder?=?new?MyViewHolder(convertView);
????????return?viewHolder;
????}

????@Override
????public?void?onBindViewHolder(MyViewHolder?holder,?int?position)?{
????????holder.tv.setText(mDatas.get(position));
????}

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

????/**
?????*?RecyclerView的ViewHolder
?????*/
????public?static?class?MyViewHolder?extends?RecyclerView.ViewHolder?{
????????TextView?tv;

????????public?MyViewHolder(View?itemView)?{
????????????super(itemView);
????????????tv?=?(TextView)?itemView.findViewById(R.id.tv);
????????}

????}
}

561a5f280001f06b04030274.jpg

561a5f2800011f1204130689.jpg

recyclerview中item的寬度就是沒辦法matchparent ?,這是為什么呢?

/**
*我在SimpleAdapter中重新設置了convertView的LayoutParams,item才能match_parent
*修改后的SimpleAdapter
*/
package?com.lee.taylor.recyclerview;

import?android.content.Context;
import?android.support.v7.widget.RecyclerView;
import?android.view.LayoutInflater;
import?android.view.View;
import?android.view.ViewGroup;
import?android.widget.TextView;

import?java.util.List;

/**
?*?Created?by?Taylor?on?2015/10/9.
?*/
public?class?SimpleAdapter?extends?RecyclerView.Adapter<SimpleAdapter.MyViewHolder>?{
????private?List<String>?mDatas;
????private?LayoutInflater?mInflater;

????public?SimpleAdapter(List<String>?mDatas,?Context?context)?{
????????this.mDatas?=?mDatas;
????????this.mInflater?=?LayoutInflater.from(context);
????}

????@Override
????public?MyViewHolder?onCreateViewHolder(ViewGroup?parent,?int?viewType)?{
????????/**
?????????*?此處inflate的時候?,如果是mInflater.inflate(R.layout.listview_item,?parent);會報如下錯誤
?????????*
?????????*?The?specified?child?already?has?a?parent.?You?must?call?removeView()?on?the?child's?parent?first
?????????*
?????????*?它說這個特定的child已經有一個parent了,你必須在這個parent中首先調用removeView()方法,才能繼續你的內容。
?????????*
?????????*?這里很明顯這個child是一個View,一個子(child)View必須依賴于父(parent)View,如果你要使用這個child,
?????????*
?????????*?則必須通過parent,而你如果就是硬想使用這個child,那么就得讓這個child與parent脫離父子關系(即removeView())
?????????*/

????????View?convertView?=?mInflater.inflate(R.layout.listview_item,?null);
????????//如果想讓item?match_parent?必須setLayoutParams??在布局中match_parent不起作用,暫時不知道為什么,(有可能是mInflater.inflate(R.layout.listview_item,?null);的原因)
????????convertView.setLayoutParams(new?ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,?72));//加了這一句話,可以match_parent了
????????MyViewHolder?viewHolder?=?new?MyViewHolder(convertView);
????????return?viewHolder;
????}

????@Override
????public?void?onBindViewHolder(MyViewHolder?holder,?int?position)?{
????????holder.tv.setText(mDatas.get(position));
????}

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

????/**
?????*?RecyclerView的ViewHolder
?????*/
????public?static?class?MyViewHolder?extends?RecyclerView.ViewHolder?{
????????TextView?tv;

????????public?MyViewHolder(View?itemView)?{
????????????super(itemView);
????????????tv?=?(TextView)?itemView.findViewById(R.id.tv);
????????}

????}
}

http://img1.sycdn.imooc.com//561a66f10001fa5204130689.jpg

正在回答

8 回答

如下修改試試:

mInflater = (LayoutInflater) context
? ? ? ?.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View?convertView?=?mInflater.from(mContext).inflate(R.layout.listview_item, parent, false);


0 回復 有任何疑惑可以回復我~

if (root != null) {
? ?if (DEBUG) {
? ? ? ?System.out.println("Creating params from root: " +
? ? ? ? ? ? ? ?root);
? ?}
? ?// Create layout params that match root, if supplied
? ?params = root.generateLayoutParams(attrs);
? ?if (!attachToRoot) {
? ? ? ?// Set the layout params for temp if we are not
? ? ? ?// attaching. (If we are, we use addView, below)
? ? ? ?temp.setLayoutParams(params);
? ?}
}


看源碼得知當你傳入的root不為null時才會setLayoutParams,所以item的match_parent不生效

0 回復 有任何疑惑可以回復我~

View itemView = inflater.inflate(R.layout.item_swipe_layout, parent, false);

使用此種方式填充item的布局 即可解決樓主說的問題 親測解決

0 回復 有任何疑惑可以回復我~

發現相同問題

0 回復 有任何疑惑可以回復我~

無效。。

0 回復 有任何疑惑可以回復我~

adapter中好像默認會把item最外層布局設置成wrap_content

0 回復 有任何疑惑可以回復我~

再給item填充布局時,使用這個函數inflate(int resId, ViewGroup parent, boolean attchToRoot); 即可

0 回復 有任何疑惑可以回復我~

http://img1.sycdn.imooc.com//561a625a0001781604130689.jpg

我搞錯了 ?不是recyclerbiew不能match_parent ? 是RecyclerView中的item無法match_parent,

上圖為我將RecyclerView北京設置成綠色后,

老師這究竟是為什么啊 ?

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
明日之星-RecyclerView
  • 參與學習       40763    人
  • 解答問題       131    個

帶領大家學習百變RecyclerView,絕對干貨,告別加班不是夢

進入課程

老師,我遇到了一個非常奇葩的問題,recyclerview 中的item match_parent不起作用!?。。?/h1> 我要回答 關注問題

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號