如何将回收器视图添加到片段

Posted

技术标签:

【中文标题】如何将回收器视图添加到片段【英文标题】:How to add a recycler view to fragment 【发布时间】:2017-06-13 00:06:19 【问题描述】:

我尝试了很多方法来在片段中添加 recyclerview。我是安卓新手。我的 android 有 5 个片段,其中一个片段我需要添加一个 recyclerview。这是我的代码

notification_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/notification_item_root"
    android:layout_
    android:layout_
    android:gravity="center_vertical|left"
    android:orientation="horizontal"
    android:paddingLeft="16dp">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/notification_item_img"
        android:layout_
        android:layout_
        android:src="@android:drawable/ic_input_get" />

   <TextView
        android:id="@+id/notification_item_text"
        android:layout_
        android:layout_
        android:gravity="center"
        android:paddingLeft="8dp"
        android:text="Test Testre" />

</LinearLayout>

notification_Fragment.xml

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

<android.support.v7.app.AlertController.RecycleListView
    android:id="@+id/notification_list"
    android:layout_
    android:layout_ />

</LinearLayout>

NotificationItem.java

public class NotificationItem 
    private String title;
    private int imageResId;

    public String getTitle() 
        return title;
    

    public void setTitle(String title) 
        this.title = title;
    

    public int getImageResId() 
        return imageResId;
    

    public void setImageResId(int imageResId) 
        this.imageResId = imageResId;
    

NotificationData.java

public class NotificationData 
    private static final String[] textItem = "pathum", "sai", "charu";
    private static final int[] imgItem = android.R.drawable.ic_popup_reminder, android.R.drawable.ic_menu_add, android.R.drawable.ic_menu_delete;

    public static List<NotificationItem> getListData() 
        List<NotificationItem> data = new ArrayList<>();

        for (int x = 0; x < 4; x++) 
            for (int i = 0; i < textItem.length && i < imgItem.length; i++) 
                NotificationItem item = new NotificationItem();
                item.setImageResId(imgItem[i]);
                item.setTitle(textItem[i]);
                data.add(item);
            
        

        return data;
    


NotificationAdapter.java

public class NotificationAdapter extends RecyclerView.Adapter<NotificationAdapter.NotificationHolder> 

    private List<NotificationItem> listData;
    private LayoutInflater inflater;

    public NotificationAdapter(List<NotificationItem> listData, Context c) 

        this.inflater = LayoutInflater.from(c);
        this.listData = listData;
    

    @Override
    public NotificationHolder onCreateViewHolder(ViewGroup parent, int viewType) 
        View view = inflater.inflate(R.layout.notification_item,parent,false);
        return new NotificationHolder(view);
    

    @Override
    public void onBindViewHolder(NotificationHolder holder, int position) 
        NotificationItem item = listData.get(position);
        holder.title.setText(item.getTitle());
        holder.icon.setImageResource(item.getImageResId());
    

    @Override
    public int getItemCount() 
        return listData.size();
    

    class NotificationHolder extends RecyclerView.ViewHolder 

        private TextView title;
        private CircleImageView icon;
        private View container;

        public NotificationHolder(View itemView) 
            super(itemView);

            title = (TextView) itemView.findViewById(R.id.notification_item_text);
            icon = (CircleImageView) itemView.findViewById(R.id.notification_item_img);
            container = itemView.findViewById(R.id.notification_item_root);
        
    

NotificationFragment.java

public class NotificationFragment extends Fragment 

    RecyclerView recyclerView;
    NotificationAdapter notificationAdapter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 

        View rootView = inflater.inflate(R.layout.notification_fragment, container, false);
    recyclerView = (RecyclerView) rootView.findViewById(R.id.notification_list);

    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    notificationAdapter = new NotificationAdapter(NotificationData.getListData(),this);
    recyclerView.setAdapter(notificationAdapter);


    return rootView;

我无法在 NotificationFragment.javaNotificationAdapter.java 中正确设置,请大家帮帮我。

【问题讨论】:

define 我无法正确处理问题出在哪里? 你能在你的layout.xml预览中查看你的recyclerview吗 @AnilDS 它正在预览默认的 recyclerview 【参考方案1】:

你为 RecyclerView 使用了错误的类,而不是 AlertController.RecyclerListView 使用这个:

<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
    android:id="@+id/my_recycler_view"
    android:scrollbars="vertical"
    android:layout_
    android:layout_/>

这里有更多信息:

RecyclerView

【讨论】:

好的,但我需要这些文件 NotificationFragment.java 和 NotificationAdapter.java 的帮助【参考方案2】:

1) 首先将依赖项添加到您的应用级 gradle 文件,然后同步您的项目

compile 'com.android.support:recyclerview-v7:23.4.0'

2) 转到您的布局文件(例如:activity_main.xml)在您的基本布局中添加 recyclerview 标签

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_
     android:layout_
     xmlns:app="http://schemas.android.com/apk/res-auto"
     app:layout_behavior="@string/appbar_scrolling_view_behavior"
     tools:context="com.examples.rehan.excluzo.Fragments.OneFragment">

<android.support.v7.widget.RecyclerView
    android:layout_
    android:layout_
    android:scrollbars="vertical"
    android:id="@+id/recycler_view">

</android.support.v7.widget.RecyclerView>

3) 创建一个类 model.java 并粘贴您的代码。

公共类模型 私有字符串名称、性别;

public model() 


public model(String name, String gender) 
    this.name= name;
    this.gender= gender;


public String getGender() 
    return gender;


public void setGender(String gneder) 
    this.gender= gender;



public String getName() 
    return name;


public void setName(String name) 
    this.name= name;

4) 在布局文件夹 item_layout.xml 中创建 xml 文件并粘贴此代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:focusable="true"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"  >

    <TextView
        android:id="@+id/name"
        android:textColor="@color/title"
        android:textSize="16dp"
        android:textStyle="bold"
        android:layout_alignParentTop="true"
        android:layout_
        android:layout_ />

    <TextView
        android:id="@+id/gender"
        android:layout_below="@id/title"
        android:layout_
        android:layout_ /> 

</RelativeLayout>

5)您需要创建适配器以将子视图添加到您的列表视图。所以创建一个文件 testAdapter.java 文件并粘贴这段代码。

在列表视图中,我将只有 2 个项目(例如:姓名和性别)

public class testAdapter extends RecyclerView.Adapter<testAdapter.MyViewHolder> 


    private List<model> productList;
    Context context;
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_layout, parent, false);

        return new MyViewHolder(itemView);
    

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) 
        model product = productList.get(position);
        holder.name.setText(product.getName());
        holder.gender.setText(product.getGender());
     

    @Override
    public int getItemCount() 
        return productList.size();
    

    public class MyViewHolder extends RecyclerView.ViewHolder 
        public TextView name,gender;

        public MyViewHolder(View view) 
            super(view);
            name = (TextView) view.findViewById(R.id.name);
            gender = (TextView) view.findViewById(R.id.gender);
        
    



    public testAdapter(List<model> productList, Context context) 
        this.productList = productList;
        this.context = context;
    


6) 现在转到您的 MainActivity.java 并粘贴此代码

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity 
    private List<modle> movieList = new ArrayList<>();
    private RecyclerView recyclerView;
    private testAdapter mAdapter;

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

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        mAdapter = new testAdapter(movieList);
        RecyclerView.LayoutManager mLayoutManager = new    LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);

        preparedata();
    

    private void preparedata() 
        model movie = new model("XXX", "Male");
        movieList.add(movie);

       //add the items according to your wish
       //name,gender
       //here i have added all items with same name and gender. you can change it
        model movie = new model("XXX", "Male");
        movieList.add(movie);

        model movie = new model("XXX", "Male");
        movieList.add(movie);

        model movie = new model("XXX", "Male");
        movieList.add(movie);

        model movie = new model("XXX", "Male");
        movieList.add(movie);

        model movie = new model("XXX", "Male");
        movieList.add(movie);


        model movie = new model("XXX", "Male");
        movieList.add(movie);

       mAdapter.notifyDataSetChanged();
    

希望这会有所帮助:)

【讨论】:

谢谢你的回答。但我需要将 recyclerview 添加到片段中。不活动。我已经通过活动完成了这件事。但是这种情况我需要在一个片段内完成。

以上是关于如何将回收器视图添加到片段的主要内容,如果未能解决你的问题,请参考以下文章

android如何使用listview而不是scrollview

如何在回收站视图上添加 OnItemClick 侦听器 [重复]

如何将Intent用于回收者视图中的片段? [关闭]

如何将点击监听器添加到我的回收器视图(Android kotlin)[重复]

如何共享元素从片段到活动的过渡

如何从android studio中的recycler视图将数据添加到SQLite数据库中