【问题标题】:How to set different layout pattern in the RecycleLayout?如何在 RecycleLayout 中设置不同的布局模式?
【发布时间】:2015-10-06 23:53:11
【问题描述】:

一般情况下,recylceLayout 和listview 类似,显示的内容是一样的,不过不知道有没有这样的方法

1) 对于奇数项,使用odd_item.xml 布局,并运行odd_item action only getView 2) 对于偶数,使用 even_item.xml 布局,并且仅在 getView 中运行 even_item 操作

这是Java,

@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rv = (RecyclerView) inflater.inflate(R.layout.fragment_news_list, container, false);

        app = (MyApp) getActivity().getApplication() ;

        StringRequest getRequest = new StringRequest(Constant.get_news_list,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        items = new ArrayList<Item>();

                        try {
                            JSONArray json_array = new JSONArray(s);
                            for (int i = 0; i < json_array.length(); i++) {
                                JSONObject object = json_array.getJSONObject(i);
                                items.add(new Item(object.getString("id"), object.getString("title_tw"), object.getString("image_url")));
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        setupRecyclerView(rv);
                    }
                },
                new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Toast.makeText(getActivity(), getResources().getString(R.string.network_err), Toast.LENGTH_LONG).show();
                    }
                });

        app.mQueue.add(getRequest);

        return rv;
    }


    private void setupRecyclerView(RecyclerView recyclerView) {
        recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
        recyclerView.setAdapter(new SimpleStringRecyclerViewAdapter(getActivity(), items));
    }

    public static class SimpleStringRecyclerViewAdapter extends RecyclerView.Adapter<SimpleStringRecyclerViewAdapter.ViewHolder> {

        private final TypedValue mTypedValue = new TypedValue();
        private int mBackground;
        private List<Item> mValues;

        public static class ViewHolder extends RecyclerView.ViewHolder {
            public String id;

            public final View mView;
            public final ImageView mImageView;
            public final TextView mTextView;

            public ViewHolder(View view) {
                super(view);
                mView = view;
                mImageView = (ImageView) view.findViewById(R.id.avatar);
                mTextView = (TextView) view.findViewById(android.R.id.text1);
            }

            @Override
            public String toString() {
                return super.toString() + " '" + mTextView.getText();
            }
        }

        public SimpleStringRecyclerViewAdapter(Context context, List<Item> items) {
            context.getTheme().resolveAttribute(R.attr.selectableItemBackground, mTypedValue, true);
            mBackground = mTypedValue.resourceId;
            mValues = items;
        }

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

        @Override
        public void onBindViewHolder(final ViewHolder holder, int position) {
            holder.id = mValues.get(position).id;
            holder.mTextView.setText(mValues.get(position).name);

            holder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = v.getContext();
                    Intent intent = new Intent(context, DetailActivity.class);
                    intent.putExtra("id", holder.id);
                    context.startActivity(intent);
                }
            });

            Glide.with(holder.mImageView.getContext())
                    .load(Constant.blog_dir + mValues.get(position).img)
                    .fitCenter()
                    .into(holder.mImageView);
        }

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

如何定制?非常感谢您的帮助。

【问题讨论】:

    标签: android view adapter android-recyclerview


    【解决方案1】:

    使用适配器的getItemViewType(int position) 方法。通过给定位置的适配器元素的属性,从此方法返回一个预定义的整数值(例如,对于偶数位置,返回一些 public static final int VIEW_EVEN = 0 等)。该值将作为viewType 参数传递给onCreateViewHolder(ViewGroup parent, int viewType)。这使您可以从此方法返回 ViewHolder 的不同子类,具体取决于 viewType 值。

    【讨论】:

      【解决方案2】:

      您需要覆盖 getViewTypeCountgetItemViewType(int position) 函数,然后为奇数和偶数位置扩展单独的布局。

      参考此链接:Reusing views in Android Listview with 2 different layouts

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 2017-03-14
        相关资源
        最近更新 更多