【问题标题】:The most efficient way to show details in Android在 Android 中显示细节的最有效方式
【发布时间】:2018-11-08 07:00:36
【问题描述】:

在活动中显示模型字段信息的最有效方式是什么?就像下图一样,他们是使用视图组(LinearLayout、RelativeLayout、ConstraintLayout)手动创建每个字段,还是使用 RecyclerView 生成?如果这是使用 RecyclerView 制作的,如何实现?

更新(如果我们使用 RecyclerView):
- 感谢您的回复,我认为你们是对的,如果我想像图片示例中那样实现,我应该使用 LinearLayout。但就我而言,我有很多数据,50 个字段,我不想为每个字段手动创建 1 个 ViewGroup。在我的示例中,我将只为我的用户模型使用 4 个字段,这些项目纯粹用于查看,没有其他视图类型,也没有特定功能。

用户模型字段:
-名称
-年龄
-性别
-地址

我希望每个用户字段都作为 recyclerview 中的一个项目,但由于我的 UserModel 不是 List,我无法将它提供给 RecyclerView。下图是我想要实现的。抱歉,如果我的问题有点模棱两可,我很难解释我的问题。

【问题讨论】:

  • imho RecyclerView
  • 可以使用 RecyclerView 和不同的 viewType,但我建议将其作为嵌套视图。
  • 如果你想使用具有多个 ViewType 的 RecyclerView 创建它。这是相关链接stackoverflow.com/questions/26245139/…
  • @RohitSingh 感谢您的回复,这将部分解决我的问题,问题是我会为 recyclerview 提供什么样的 List?我可以在每个字段的模型中循环吗?例如,我在模型 [姓名、年龄、地址] 中有 3 个字段,如何为 1 个 recyclerview 项目制作 1 个模型字段?谢谢。
  • 欢迎来到 StackOverflow!在我看来,具有 n 个不同 viewTypes 的 RecyclerView 将是矫枉过正。即使您的模型增加了很多并且每个都有不同的功能(呼叫号码,开始导航等),您也不会拥有超过 20 个项目。我会手动实现 LinearLayout 中的每个元素。

标签: android android-studio layout android-recyclerview


【解决方案1】:

正如您在 cmets 中向我解释的那样。

  • 您有一个模型类 USER,它有 50 个字段。
  • 如果项目看起来与屏幕截图中的一样。

如果是这种情况,用Simple RecyclerView可以轻松解决,甚至不用ViewType

您的 ItemView 有一个徽标、一个标题和一个描述。

1) 为列表中的项目创建一个新模型。

class ListItem{

   int logo;
   int title;
   int desc;

   // write getter and setter

}

2) 填充列表?

User Model 中获取数据并将其转换为ListItem Model
假设第一项是用户的姓名。
这样做

 ListItem username = new ListItem();
   username.setTitle("NAME");
   username .setLogo(R.id.userLogo);
   username.setDesc(user.name);

假设第二项是用户的年龄

这样做

 ListItem age = new ListItem();
   age.setTitle("AGE");
   username .setLogo(R.id.ageLogo);
   username.setDesc(user.age);

3) 在适配器中输入 itemList

List<ListItem> myList = new List<ListItem>();
myList.add(username);
myList.add(age);

YourAdapter adapter = new Adapter(context,myList);
recyclerView.setAdapter(adapter);

希望这会有所帮助。和平:)

【讨论】:

    【解决方案2】:

    我会使用带有自定义适配器的RecyclerView 来实现此结果,具体取决于每个项目的高级程度。如果是简单的交互和设计,例如icontext 或者click listener,那就足够了。

    如果它更高级,每个按钮可以执行许多不同类型的操作,那么也许您可以使用LinearLayout 并生成具有特定操作的每个按钮。

    如果您希望生成按钮,请滚动到底部查看示例

    假设您想使用RecyclerView,那么它可能看起来像这样:

    你可以有一个看起来像这样的适配器项:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/padding_view_small">
    
        <ImageView
            android:id="@+id/icon"
            android:layout_width="25dp"
            android:layout_height="wrap_content"
            app:srcCompat="@drawable/ic_person_black_24dp"/>
    
        <TextView
            android:id="@+id/text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/placeholder"
            android:textColor="@color/black"
            android:layout_marginStart="@dimen/padding_view_small"
            android:layout_marginLeft="@dimen/padding_view_small"/>
    
    </LinearLayout>
    

    您的适配器

    public class MyAdapter extends RecyclerView.Adapter
    {
        private Context _context;
    
        private List<MyObject> _items;
    
        public void setItems(List<MyObject> items)
        {
            this._items = items;
            notifyDataSetChanged();
        }
    
        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
        {
            _context = parent.getContext();
            return new MyAdapter.ItemViewHolder(parent);
        }
    
        @Override
        public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position)
        {
            final MyAdapter.ItemViewHolder viewHolder = (MyAdapter.ItemViewHolder) holder;
            final MyObject item = _items.get(position);
    
            viewHolder._icon.setImageResource(item.getIcon());
            viewHolder._name.setText(item.getText());
        }
    
        @Override
        public int getItemCount()
        {
            return _items != null ? _items.size() : 0;
        }
    
        private static class ItemViewHolder extends RecyclerView.ViewHolder
        {
            private ImageView _icon;
            private TextView _text;
    
            private ItemViewHolder(ViewGroup parent)
            {
                super(LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_layout, parent, false));
                this._icon = itemView.findViewById(R.id.icon);
                this._text = itemView.findViewById(R.id.text);
            }
        }
    }
    

    MyObject 类,用于存储有关每个按钮的信息

    public class MyObject
    {
        private int _icon;
        private String _text;
    
        public MyObject(int icon, String text)
        {
            this._icon = icon;
            this._text = text;
        }
    
        public int getIcon()
        {
            return this._icon;
        }
    
        public int getText()
        {
            return this._text;
        }
    }
    

    那么您也可以直接将ClickListener 传递给MyObject,或者您还可以添加一个名为Type 的附加变量,以便您知道当用户单击特定类型时该怎么做。

    在没有 RecyclerView 的情况下生成按钮

    您可以拥有一个基本的 LinearLayout 视图持有者,它将持有所有视图。

    <LinearLayout
        android:id="@+id/action_holder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"/>
    

    生成视图的方法

    private View generateView(int icon, String text)
    {
        LayoutInflater inflater = LayoutInflater.from(_context);
        View view = inflater.inflate(R.layout.adapter_layout, null);
    
        ImageView icon = view.findViewById(R.id.icon);
        icon.setImageResource(icon);
    
        TextView text = view.findViewById(R.id.text);
        text.setText(text);
    
        return view;
    }
    

    动态添加新视图

    View showDialogView = generateView(ContextCompat.getDrawable(_context, R.drawable.test), "Show dialog");
    //Here you can set a click listener to what should happen when you click the item
    showDialogView.setOnClickListener....
    
    linearLayout.addView(showDialogView);
    

    【讨论】:

    • 关于您的 recyclerview 建议,这不是我正在寻找的答案,我已经更新了我的问题,对于这个模棱两可的问题,我深表歉意。我实际上喜欢您的第二个答案,我不知道您可以在不使用 RecyclerView 的情况下生成视图。如果没有关于 recyclerview 的答案,我实际上会将此作为我的问题的替代方案。谢谢你,你真的有一个很好的建议。抱歉,我仍然无法投票,如果无法完成 recyclerview,我会将其标记为答案。
    猜你喜欢
    • 2022-01-26
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多