我正在尝试向用户显示一个对话框,其中包含一个列表。无论我如何尝试,它都不会显示在对话框中。 代码: 这是在 TaskInputActivity 中,我在其中为列表视图创建对话框和适配器(我认为问题出在此处):
public void createDialog() {
Dialog d = new Dialog(this);
Log.d("Checkpoint A", "aaa");
View view = getLayoutInflater().inflate(R.layout.dialog_time_picker, null);
ListView day = view.findViewById(R.id.lvDay);
ArrayList<Integer> allDays = new ArrayList<>();
for (int i = 1; i <= 31; i++) {
allDays.add(i);
}
DayAdapter dayAdapter = new DayAdapter(allDays, d.getContext());
day.setAdapter(dayAdapter);
Log.d("Checkpoint B", "bbb");
TextView tvCurrentDate = findViewById(R.id.tvCurrentDate);
day.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String[] split = tvCurrentDate.getText().toString().split(String.valueOf('.'));
String date = (position + 1) + "." + split[1] + "." + split[2];
tvCurrentDate.setText(date);
}
});
Log.d("Checkpoint C", "ccc");
d.setContentView(R.layout.dialog_time_picker);
d.show();
}
这是适配器:
package com.example.todolistproj.Adapters;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.example.todolistproj.Constants;
import com.example.todolistproj.R;
import org.w3c.dom.Text;
import java.util.ArrayList;
public class DayAdapter extends BaseAdapter {
private ArrayList<Integer> days;
private Context context;
public DayAdapter(Context c) {
days = new ArrayList<>();
for (int i = 1; i <= 31; i++) {
days.add(i);
}
Log.d("DAYS", days.toString());
context = c;
}
public DayAdapter(ArrayList<Integer> days, Context context) {
Log.d("CONSTRUCTOR", "2 params");
this.days = days;
this.context = context;
}
@Override
public int getCount() {
return days.size();
}
@Override
public Object getItem(int position) {
return days.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("GETVIEW", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
View view = convertView;
if (view == null)
view = ((Activity) context).getLayoutInflater().inflate(R.layout.custom_date_list_view, parent, false);
TextView tvItem = view.findViewById(R.id.tvItem);
int item = days.get(position);
tvItem.setText(item+"");
return view;
}
}
XML:
对话框 xml (dialog_time_picker.xml)(不用担心 LinearLayout 中的 LinearLayout 我有一个计划,但我想先解决这个问题):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvCurrentDate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:layout_margin="20dp"
android:textSize="20dp"
android:text="1.1.1970" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/lvDay"
android:layout_width="match_parent"
android:layout_height="wrap_context" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
custom_date_list_view.xml,非常不言自明:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
PS:我知道我可以使用日期选择器对话框,但我想尝试一下。
我在网上搜索了与此问题相关的所有内容,但没有任何帮助。我不太明白创建 ListView 的整个过程是如何工作的,所以我无法开始理解如何解决这个问题。
解决方案在@Computable的评论中给出。
在
createDialog()
的末尾,我放了d.setContentView(R.layour.dialog_time_picker);
,这基本上撤销了我之前所做的所有事情。
解决方案:只需将行更改为
d.setContentView(view);
。
此外,
d.getContext()
给出的上下文是ContextThemeWrapper
的一个实例(我不知道为什么),所以当你尝试将它转换为view = ((Activity)context).getLayoutInflater().inflate(R.layout.custom_date_list_view, parent, false);
时它会崩溃
解决方案:将此 while 循环放在 if 语句之前:
while(!(context instanceof Activity)) {
context = ((ContextWrapper) context).getBaseContext();
}
这个答案是由 OP DoubleYouSlash 在 CC BY-SA 4.0 下作为 edit 发布到问题 listview not shown indialog (JAVA, Android) (SOLVED)。