在图形用户界面中显示列表 - java/Android Studio
Display a list in a gui - java/Android Studio
我的目标是显示一个列表,其中每个元素(迭代)显示有两个按钮:
按钮将更改列表特定元素中的变量。
我的问题:如何在 Android Studio 中创建此图形用户界面?
这里我在android(java)中实现了一个RecyclerView的简单例子。您可以根据需要更改它:
在布局文件夹中添加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>
这是基于您的示例图片。此布局包含单行列表中的所有视图。如果你想在每行中添加更多按钮或文本,你必须将它们添加到这个文件中。
对于 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 函数中使用这些视图。
在activity_main.xml中添加一个RecyclerView:
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recyclerView"/>
在 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));
结果:
我的目标是显示一个列表,其中每个元素(迭代)显示有两个按钮:
按钮将更改列表特定元素中的变量。
我的问题:如何在 Android Studio 中创建此图形用户界面?
这里我在android(java)中实现了一个RecyclerView的简单例子。您可以根据需要更改它:
在布局文件夹中添加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>
这是基于您的示例图片。此布局包含单行列表中的所有视图。如果你想在每行中添加更多按钮或文本,你必须将它们添加到这个文件中。
对于 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 函数中使用这些视图。
在activity_main.xml中添加一个RecyclerView:
<androidx.recyclerview.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recyclerView"/>
在 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));
结果: