在图形用户界面中显示列表 - java/Android Studio

Display a list in a gui - java/Android Studio

我的目标是显示一个列表,其中每个元素(迭代)显示有两个按钮:

按钮将更改列表特定元素中的变量。

我的问题:如何在 Android Studio 中创建此图形用户界面?

这里我在android(java)中实现了一个RecyclerView的简单例子。您可以根据需要更改它:

  1. 在布局文件夹中添加item.xml,并在其中写入这些行:

     <?xml version="1.0" encoding="utf-8"?>
     <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
    
     <TextView
         android:id="@+id/titleTextView"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_margin="20dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
    
     <Button
         android:id="@+id/option2Button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_margin="20dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
    
     <Button
         android:id="@+id/option1Button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_margin="20dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintRight_toLeftOf="@+id/option2Button"
         app:layout_constraintTop_toTopOf="parent" />
    
     </androidx.constraintlayout.widget.ConstraintLayout>
    

这是基于您的示例图片。此布局包含单行列表中的所有视图。如果你想在每行中添加更多按钮或文本,你必须将它们添加到这个文件中。

  1. 对于 RecyclerView,您总是需要一个适配器 class。因此,将 MyAdapter.java class 添加到您的项目中,如下所示:

     public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
     {
         private Context context;
         private List<String> titles;
    
         MyAdapter(Context context, List<String> titles)
         {
             this.context = context;
             this.titles = titles;
         }
    
         @NonNull
         @Override
         public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
         {
             RecyclerView.ViewHolder viewHolder;
             LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    
             viewHolder = getViewHolder(parent, inflater);
    
             return viewHolder;
         }
    
         private RecyclerView.ViewHolder getViewHolder(ViewGroup parent, LayoutInflater inflater)
         {
             RecyclerView.ViewHolder viewHolder;
             View v1 = inflater.inflate(R.layout.item, parent, false);
             viewHolder = new ItemVH(v1);
             return viewHolder;
         }
    
         @Override
         public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position)
         {
             ItemVH itemVH = (ItemVH) holder;
    
             // set title for each item:
             itemVH.titleTextView.setText(titles.get(position));
             itemVH.option1Button.setText("option 1");
             itemVH.option2Button.setText("option 2");
    
             // click listener for first button:
             itemVH.option1Button.setOnClickListener(new View.OnClickListener()
             {
                 @Override
                 public void onClick(View v)
                 {
                     // option 1 button clicked
                 }
             });
    
             // click listener for second button:
             itemVH.option2Button.setOnClickListener(new View.OnClickListener()
             {
                 @Override
                 public void onClick(View v)
                 {
                     // option 2 button clicked
                 }
             });
         }
    
         @Override
         public int getItemCount()
         {
             return titles.size();
         }
    
         // add item to list:
         public void addItem(String title)
         {
             titles.add(title);
             notifyItemInserted(titles.size() - 1);
         }
    
         // remove item from list:
         public void remove(String title)
         {
             int position = titles.indexOf(title);
             if (position > -1)
             {
                 titles.remove(position);
                 notifyItemRemoved(position);
             }
         }
    
         protected class ItemVH extends RecyclerView.ViewHolder
         {
             private TextView titleTextView;
             private Button option1Button;
             private Button option2Button;
    
             public ItemVH(View itemView)
             {
                 super(itemView);
    
                 titleTextView = itemView.findViewById(R.id.titleTextView);
                 option1Button = itemView.findViewById(R.id.option1Button);
                 option2Button = itemView.findViewById(R.id.option2Button);
             }
         }
     }
    

标题列表是项目上显示的字符串列表。您创建此列表并将其从 MainActivity 发送到 MyAdapter class。单个项目中的所有视图都可以在 ItemVH class 中找到,您可以在 onBindViewHolder 函数中使用这些视图。

  1. 在activity_main.xml中添加一个RecyclerView:

     <androidx.recyclerview.widget.RecyclerView
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:id="@+id/recyclerView"/>
    
  2. 在 MainActivity.java 的 onCreate 中添加这些行:

     // create list:
     List<String> titles = new ArrayList<>();
     titles.add("first item");
     titles.add("second item");
     titles.add("third item");
    
     // define the adapter:
     MyAdapter adapter = new MyAdapter(this, titles);
    
     // set the RecyclerView:
     RecyclerView recyclerView = findViewById(R.id.recyclerView);
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
     recyclerView.setLayoutManager(layoutManager);
     recyclerView.setAdapter(adapter);
     recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
    

结果: