水平回收视图在特定位置进入垂直回收视图

时间:2017-07-24 15:05:10

标签: android android-recyclerview

我想将水平Recyclerview插入/显示到特定位置(在此示例位置:1)

Vertical recyclerview - 显示TextView + shape(rectange) 水平回收视图 - 显示ImageViews(彼此相邻)

.XML的

horizo​​ntal_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
    android:id="@+id/horizontal_recyclerview"
    android:layout_width="368dp"
    android:layout_height="wrap_content"
    android:layout_marginBottom="60dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="2dp"
    android:padding="0dp"/>

<android.support.constraint.ConstraintLayout 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:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.mkalejs.training.MainActivity">

vertical_layout.xml

<android.support.v7.widget.RecyclerView
    android:id="@+id/vertical_recyclerview"
    android:layout_width="368dp"
    android:layout_height="wrap_content"
    android:layout_marginBottom="60dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="2dp"
    android:padding="0dp"/>

</android.support.constraint.ConstraintLayout>

vertical_layout_item.xml

    <EditText
        android:id="@+id/lbl_url_text"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:background="@android:color/transparent"
        android:inputType="textPersonName"
        android:padding="5dp"
        android:layout_gravity="center"
        android:text="Name" />

    <View
        android:id="@+id/rectangle"
        android:layout_width="195dp"
        android:layout_height="100dp"
        android:background="@drawable/rectangle" />

horizo​​ntal_layout_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp"
android:visibility="visible"
android:weightSum="1">


<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/img_horizontal_slider"
    android:layout_width="33dp"
    android:layout_height="33dp"
    android:adjustViewBounds="true"
    android:visibility="visible" />


 </LinearLayout>

在recyclerview概念中可能存在一些小误解。我不确定在哪里可以调用horizontal_recyclerview"不将它作为null返回(就像我现在一样)并用数据填充它。 XML结构错了吗?随意更新代码部分。

这应该是好的

MainActivity.class

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.vertical_layout);

        ArrayList<PictureData> bundleOfData =  prepareData();

        RecyclerView rv = (RecyclerView) findViewById(R.id.vertical_recyclerview);
        VerticalAdapter adapter = new VerticalAdapter(bundleOfData, this);
        rv.setAdapter(adapter);
        //rv.setNestedScrollingEnabled(true);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        rv.setLayoutManager(layoutManager);
    }

VerticalAdapter.class

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

    private ArrayList<PictureData> pictures;
    Context context;

    public VerticalAdapter(ArrayList<PictureData> pictures, Context context) 
    {
        this.pictures = pictures;
        this.context = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView;
        switch (viewType) {
            case 1:
                itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.horizontal_layout_item, parent, false);
                return new HorizontalViewHolder(itemView);
            default:
                itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.vertical_layout_item, parent, false);
                return new VerticalViewHolder(itemView);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (holder.getItemViewType()){
            case 1:
                HorizontalViewHolder hVh = (HorizontalViewHolder) holder;
                HorizontalAdapter horizontal_adapter = new HorizontalAdapter(pictures, context);
                hVh.horizontal_rec.setAdapter(horizontal_adapter);
                break;
            default:
                VerticalViewHolder vVh = (VerticalViewHolder) holder;
                vVh.textView.setText(pictures.get(position).getPictureUrl());
                break;
        }
    }

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

    @Override
    public int getItemViewType(int position) {
        if(position == 1){
            return 1;
        }else{
            return 0;
        }
    }

}

Horizo​​ntalViewHolder.class

我在这里得到一个错误。显然,我在HORIZONTAL_LAYOUT中没有(img_horizontal_slider),但是将ImageView + RecyclerView放在一个布局文件中并在此处调用会感觉不对(?)

public class HorizontalViewHolder extends RecyclerView.ViewHolder{
    public ImageView imagePositionInLayout;
    public RecyclerView horizontal_rec;

    public HorizontalViewHolder(View itemView) {
        super(itemView);

        LinearLayoutManager layoutManager = new LinearLayoutManager(itemView.getContext(), LinearLayoutManager.HORIZONTAL, false);
        horizontal_rec = itemView.findViewById(R.id.vertical_recyclerview);
        imagePositionInLayout = itemView.findViewById(R.id.img_horizontal_slider);
        horizontal_rec.setLayoutManager(layoutManager);
    }

    public ImageView getView() {
        return imagePositionInLayout;
    }
}

Horizo​​ntalAdapter.class

ublic class HorizontalAdapter extends RecyclerView.Adapter<HorizontalViewHolder> {
    private ArrayList<PictureData> pictures;
    Context context;

    public HorizontalAdapter(ArrayList<PictureData> pictures, Context context) {
        this.pictures = pictures;
        this.context = context;
    }

    @Override
    public HorizontalViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.horizontal_layout_item, parent, false);
        return new HorizontalViewHolder(view);
    }

    @Override
    public void onBindViewHolder(HorizontalViewHolder holder, int position) 
    {
        Picasso.Builder builder = new Picasso.Builder(context);
        Picasso picasso = builder.build();
        picasso
                .load("http://nuclearpixel.com/content/icons/2010-02-09_stellar_icons_from_space_from_2005/earth_128.png")
                .placeholder(R.mipmap.ic_launcher_round)
                .into(holder.imagePositionInLayout);
    }

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


}

我是Android的新手,所以我希望人们会对错误以及解决方法给出一些好的解释。每个建议都会很乐意接受。如果有人真正研究并解释,我将非常感激,因为我现在感到非常迷茫。

0 个答案:

没有答案
相关问题