[英]In Android, given a ListView of items with TextView and RadioGroup, how to add items dynamically?
我需要管理一個 ListView,以便每個項目都有一個 textView 和一個 RadioGroup。 以下是一項的 xml 文件: controls_layout_row.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:padding="20dp"
android:background="@drawable/fragment_template"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/control_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginBottom="5dp"/>
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/control_name"
android:id="@+id/control_options_list"
android:layout_marginBottom="20dp"
tools:layout_height="150dip">
<!-- items added within code -->
</RadioGroup>
</RelativeLayout>
這些項目是 ListView 的一部分 - 以下是 ListView 的 xml 文件:
控制對話框.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:padding="20dp"
android:background="@drawable/fragment_template"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/controls_list_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="Controls"
android:textSize="20dp"
android:textStyle="bold"
android:layout_marginBottom="5dp"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/controls_list_title"
android:id="@+id/controls_list"
tools:layout_height="150dip">
<!-- items added within code -->
</ListView>
//Close button
<Button android:id="@+id/controls_close_button"
android:layout_below="@id/controls_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14dp"
android:text="Close"
android:layout_alignParentEnd="true"
android:textAllCaps="false"
android:textStyle="bold"/>
</RelativeLayout>
現在,這些項目一開始是未知的。 應用程序使用 JNI 接口從連接的硬件獲取信息,然后在活動中使用一些 getter 以了解哪些項目必須出現在對話框中。 我嘗試了兩種方法,但都陷入了困境。
第一種方法:每次我需要時只需創建一些項目並將其視圖添加到列表中:
// retrieve item view
final View emittersRowView = inflater.inflate(R.layout.controls_layout_row, null);
// set TextView
final TextView emitterTitle = emittersRowView.findViewById(R.id.control_name);
emitterTitle.setText("Projector");
//set RadioGroup
final String emitterDescriptions[] = getOptionDescriptions(Option.EMITTER_ENABLED);
final RadioGroup emittersRadioGroup = emittersRowView.findViewById(R.id.control_options_list);
// adding buttons to the group
for(int i = 0; i < emitterDescriptions.length; ++i) {
RadioButton button = new RadioButton(activity);
button.setId(i);
button.setText(emitterDescriptions[i]);
button.setTextColor(getResources().getColor(R.color.white));
button.setChecked(i == indexOfCurrentEmitter);
emittersRadioGroup.addView(button);
}
emittersRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
List<Sensor> sensors = mDevice.querySensors();
for (Sensor s : sensors) {
if (s.supports(Option.EMITTER_ENABLED)) {
s.setValue(Option.EMITTER_ENABLED, checkedId);
}
}
}
});
//add control to list
ListView controlsList = fragmentView.findViewById(R.id.controls_list);
controlsList.addView(emittersRowView);
這種方法沒有奏效。 我在其他論壇上讀到,如果不使用 adpater,這將無法工作。 這對我來說似乎很奇怪,因為使用 RadioGroup object 上的 addView 方法來添加 RadioButton 對象效果很好。
第二種方法:使用自定義適配器:我已經定義了一個適配器,我的計划是首先構建:
適配器代碼:
class CustomAdapter extends BaseAdapter {
@Override
public int getCount() {
return numOfControls;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Activity activity = getActivity();
convertView = activity.getLayoutInflater().inflate(R.layout.controls_layout_row, null);
TextView control_name = convertView.findViewById(R.id.control_name);
RadioGroup control_options = convertView.findViewById(R.id.control_options_list);
control_name.setText(mControlNames[i]);
control_options.set....???
return convertView;
}
}
請幫助我使它工作。
開始一個新項目並嘗試下面的完整示例代碼,
MainActivity.java:
public class MainActivity extends AppCompatActivity {
class Control {
String name;
String[] options;
int checkedPosition = -1;
public Control(String name, String[] options) {
this.name = name;
this.options = options;
}
public String getName() {
return name;
}
public String[] getOptions() {
return options;
}
public int getCheckedPosition() {
return checkedPosition;
}
public void setCheckedPosition(int checkedPosition) {
this.checkedPosition = checkedPosition;
}
}
Control[] controls = new Control[10];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView controlsList = findViewById(R.id.controls_list);
createSampleData();
CustomAdapter adapter = new CustomAdapter(this, 0, controls);
controlsList.setAdapter(adapter);
Button button = findViewById(R.id.controls_close_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String msg = "";
for (int i = 0; i < controls.length; i++) {
msg += controls[i].getName() + " , " + controls[i].getCheckedPosition() + "\n";
}
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
}
});
}
private void createSampleData() {
Random random = new Random();
for (int i = 0; i < controls.length; i++) {
int j = random.nextInt(4) + 2;
String[] options = new String[j];
for (int k = 0; k < j; k++) {
options[k] = (i + 1) + "-" + k;
}
controls[i] = new Control("Control " + (i + 1), options);
}
}
}
CustomAdapter.java:
public class CustomAdapter extends ArrayAdapter {
Context context;
LayoutInflater inflater;
public CustomAdapter(@NonNull Context context, int resource, @NonNull MainActivity.Control[] objects) {
super(context, resource, objects);
this.context = context;
inflater = LayoutInflater.from(context);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
convertView = inflater.inflate(R.layout.controls_layout_row, null);
TextView control_name = convertView.findViewById(R.id.control_name);
RadioGroup control_options = convertView.findViewById(R.id.control_options_list);
MainActivity.Control control = (MainActivity.Control)getItem(position);
control_name.setText(control.getName());
String[] options = control.getOptions();
for(int i = 0; i < options.length; i++) {
RadioButton button = new RadioButton(context);
button.setId(i);
button.setText(options[i]);
button.setTextColor(Color.WHITE);
button.setChecked(i == control.getCheckedPosition());
control_options.addView(button);
}
control_options.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
int pos = (int)radioGroup.getTag();
MainActivity.Control changedControl = (MainActivity.Control)getItem(pos);
changedControl.setCheckedPosition(i);
}
});
control_options.setTag(position);
return convertView;
}
}
使用您發布的布局。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.