在Android中显示细节的最有效方法

时间:2018-11-08 07:00:36

标签: android android-studio layout android-recyclerview

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

Image

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

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

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

I want to achieve

2 个答案:

答案 0 :(得分:0)

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

  • 您有一个Model类USER,其中有50个字段。
  • 如果项目看起来像“屏幕快照”中的一样。

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

  

您的ItemView具有徽标,标题和描述。

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

class ListItem{

   int logo;
   int title;
   int desc;

   // write getter and setter

}

2)填充列表?

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

 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);

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

答案 1 :(得分:-1)

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

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

如果您想生成按钮,请滚动至底部作为示例

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

您可能会看到一个如下所示的适配器项:

enter image description here

<?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);