列表视图未显示在对话框中(JAVA、Android)

问题描述 投票:0回答:1

我正在尝试向用户显示一个对话框,其中包含一个列表。无论我如何尝试,它都不会显示在对话框中。 代码: 这是在 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 的整个过程是如何工作的,所以我无法开始理解如何解决这个问题。

java android listview android-listview
1个回答
0
投票

解决方案在@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)

© www.soinside.com 2019 - 2024. All rights reserved.