0

Generally, the recylceLayout is similar to listview and show the same content, however, I wonder are there any way to do like this

1) For odd item , use odd_item.xml layout, and run odd_item action only getView 2) For even, use even_item.xml layout, and run even_item action only in getView

This is the 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();
        }
    }

How to customized for that? Thanks a lot for helping.

user782104
  • 13,233
  • 55
  • 172
  • 312

2 Answers2

1

You need to override getViewTypeCount and getItemViewType(int position) functions and then inflate separate layouts for odd and even positions.

Refer to this link: Reusing views in Android Listview with 2 different layouts

Community
  • 1
  • 1
pgiitu
  • 1,671
  • 1
  • 15
  • 23
1

Use getItemViewType(int position) method of the adapter. By the properties of the element from the adapter at given position, return a pre-defined integer value from this method (so, for example, for even positions return some public static final int VIEW_EVEN = 0 etc). This value will be passed to onCreateViewHolder(ViewGroup parent, int viewType) as the viewType parameter. That enables you to return different subclasses of ViewHolder from this method, depending on the viewType value.

maciekjanusz
  • 4,702
  • 25
  • 36