2016-07-10 4 views
1

Я пытаюсь вставить RecyclerView в тело пользовательского представления (a RefreshableList).Внедрение RecyclerView в пользовательский вид

Это структура моего проекта: она содержит 2 модуля, приложение & Rlist.

Project view

Rlist модуль содержит пользовательское представление (RefreshableList), в котором я хочу встроить RecyclerView.

RefreshableList.java (Пользовательский вид)

public class RefreshableList extends RelativeLayout { 

    private RecyclerView mRecyclerView; 

    private Context mContext; 
    private MyAdapter mAdapter; 

    public RefreshableList(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
     Log.i("ADAPTER", "RefreshableList is initializing views..."); 

     setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
       ViewGroup.LayoutParams.MATCH_PARENT)); 

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(
       Context.LAYOUT_INFLATER_SERVICE); 
     View view = inflater.inflate(R.layout.refreshable_list, null); 

     findViewsById(view); 
     setupRecyclerView(); 
    } 

    private void findViewsById(View view) { 
     mRecyclerView = (RecyclerView) view.findViewById(R.id.dataRecyclerView); 
     Log.i("ADAPTER", "RecyclerView has been initialized."); 
    } 

    private void setupRecyclerView() { 
     mRecyclerView.setHasFixedSize(true); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext)); 
     Log.i("ADAPTER", "RecyclerView has been setup."); 
    } 

    public void setAdapter(MyAdapter adapter) { 
     mAdapter = adapter; 
     mRecyclerView.setAdapter(mAdapter); 
     Log.i("ADAPTER", "Adapter has been set." + mAdapter.getItemCount()); 
    } 
} 

MyAdapter.java (Адаптер RecyclerView «s)

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    protected Context mContext; 
    protected List<String> mItems; 

    public MyAdapter(Context context, List<String> items) { 
     mContext = context; 
     mItems = new ArrayList<>(items); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.item_row, parent, false); 
     Log.i("ADAPTER", "Creating row..."); 

     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.label.setText(mItems.get(position)); 
    } 

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

    class ViewHolder extends RecyclerView.ViewHolder { 

     TextView label; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      label = (TextView) itemView.findViewById(R.id.label); 
     } 
    } 
} 

item_row.xml: (макет XML элементов RecyclerView)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="60dp"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="New Text" 
     android:id="@+id/label" 
     android:gravity="left|center_vertical" 
     android:padding="8dp" 
     android:background="#ff0000"/> 
</LinearLayout> 

refreshable_list.xml: (XML-макет RefreshableList пользовательского вида)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/dataRecyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</LinearLayout> 

Все это код принадлежит Rlist модуля. Для того чтобы проверить это, я добавил MainActivity в приложение модуль, где я встроить RefreshableList:

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    @Bind(R.id.list) 
    RefreshableList mRefreshableList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.bind(this); 

     mRefreshableList.setAdapter(new MyAdapter(
       this, Arrays.asList("Java", "Android", "Python", "Kivy"))); 
    } 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.zouag.refreshablelist.MainActivity" 
    android:background="#00ff00"> 

    <com.zouag.rlist.RefreshableList 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#ffff00"/> 
</RelativeLayout> 

После запуска приложения я не вижу ни одного из элементов RecyclerView: (хотя RecyclerView отчетливо видно, отмеченные желтым цветом)

Run

Что я здесь отсутствует?

ответ

2

Не видно, что ваш recyclerview виден, ваш релятивизационный выход. Вы не прикрепляете раздутый макет к своей группе просмотра.

Вызов:

View view = inflater.inflate(R.layout.refreshable_list, null); 

просто раздувает макет, но dosen't прикрепить его к просмотру. Если и хочет придерживаться этого нужно прикрепить вид после накачивания по:

this.addView(view) 

Или просто позвоните:

View view = inflater.inflate(R.layout.refreshable_list, this,true); 

который крепит завышенное расположение к представлению корня.

+0

@MohammedAoufZOUAG: Вопрос в том, почему 'LayoutInflater.from' не работает в вашем случае. вы пробовали его передать 'mContext' вместо' parent.getContext() '? –

+0

Нет проблем с раздуванием представлений зрителя LayoutInflater.from. Проблема в том, что recyclerview сам не прилагается ... –

Смежные вопросы