Java ListView中的ImageView忽略所有布局尺寸并填充整个屏幕

Java ListView中的ImageView忽略所有布局尺寸并填充整个屏幕,java,android,android-layout,listview,Java,Android,Android Layout,Listview,我正在尝试创建一组4个动态更新图标列表视图。 为此,我将4个listview放在一个gridview中,并为每个listview项使用一个自定义布局,其中包含一个imageview。我正在处理更改自定义适配器内的图标。我正在使用毕加索库来处理图标,我所有的图标都以.png文件的形式存储在本地的drawable中 我没有收到任何错误,但当我运行应用程序时,我得到的只是一个占据整个屏幕的图标。我在gridview上面有一个小的imageview和一个textview,其中包含图标列表,但一个图标甚至

我正在尝试创建一组4个动态更新图标列表视图。 为此,我将4个listview放在一个gridview中,并为每个listview项使用一个自定义布局,其中包含一个imageview。我正在处理更改自定义适配器内的图标。我正在使用毕加索库来处理图标,我所有的图标都以.png文件的形式存储在本地的drawable中

我没有收到任何错误,但当我运行应用程序时,我得到的只是一个占据整个屏幕的图标。我在gridview上面有一个小的imageview和一个textview,其中包含图标列表,但一个图标甚至会将其推到一边

这是我的布局预览,以及在模拟器中运行的应用程序的屏幕截图。(如果我在手机上运行,结果是一样的)

,,

(为没有嵌入而道歉,我是新加入的,还没有10个代表哈哈)

我已经尝试在运行时在自定义适配器内调整映像的大小。我已经尝试设置listview的最大宽度——在运行时(因为我想适应不同的屏幕尺寸)和xml文件中。我尝试在android studio之外调整源.png文件的大小。什么都没用

我的活动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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.sta.tomov0.MainActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tomoFace"
        android:src="@drawable/office38"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="20dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/textView"
        android:layout_alignParentLeft="false"
        android:layout_alignParentStart="false"
        android:layout_below="@+id/tomoFace"
        android:layout_centerHorizontal="true"
        android:layout_alignParentTop="false"
        android:layout_marginBottom="50dp" />

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:rowCount="1"
        android:id="@+id/gridLayout"
        android:layout_below="@+id/textView"
        android:columnCount="5">

        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listViewA"
            android:layout_row="0"
            android:layout_column="0" />

        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listViewB"
            android:layout_row="0"
            android:layout_column="1" />

        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listViewC"
            android:layout_row="0"
            android:layout_column="2" />

        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listViewD"
            android:layout_column="3"
            android:layout_row="0" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton"
            android:layout_column="4"
            android:layout_row="0"
            android:onClick="addTask"
            android:src="@android:drawable/stat_notify_more" />

    </GridLayout>

</RelativeLayout>

我的listview布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listImageView"
        android:layout_alignParentTop="false"
        android:layout_alignParentLeft="false"
        android:layout_alignParentStart="false" />
</RelativeLayout>

和我的activity.java文件:

public class MainActivity extends AppCompatActivity {
    ImageView tomoface;
    ListView listViewA;
    ArrayList arrayListA = new ArrayList<Integer>();
    Boolean aExists = false;
    ListView listViewB;
    ArrayList arrayListB = new ArrayList<Integer>();
    Boolean bExists = false;
    ListView listViewC;
    ArrayList arrayListC = new ArrayList<Integer>();
    Boolean cExists = false;
    ListView listViewD;
    ArrayList arrayListD = new ArrayList<Integer>();
    Boolean dExists = false;
    Button addButton;
    TextView tomoText;
    File tomoFiles;
    File taskFiles;
    String currentCommunity = "Dep";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Paper.init(getApplicationContext());

        tomoface = (ImageView) findViewById(R.id.tomoFace);
        tomoface.setImageResource(R.drawable.favourite15);
        tomoText = (TextView) findViewById(R.id.textView);
        listViewA = (ListView) findViewById(R.id.listViewA);
        listViewB = (ListView) findViewById(R.id.listViewB);
        listViewC = (ListView) findViewById(R.id.listViewC);
        listViewD = (ListView) findViewById(R.id.listViewD);
        tomoFiles = getDir("TomoFiles", MODE_PRIVATE);
        taskFiles = new File(tomoFiles, "taskFiles");

        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int width =(size.x)/5;
        ViewGroup.LayoutParams params = listViewA.getLayoutParams();
        params.height = width;
        params.width = width;

        listViewA.setLayoutParams(params);
        listViewB.setLayoutParams(params);
        listViewC.setLayoutParams(params);
        listViewD.setLayoutParams(params);

        /*
        If there is no data saved, the following code creates a list of (empty) lists to hold TaskClass objects
        The 4 sub lists each represent one category.
        If there is data saved, the following code retrieves that data, and creates 4 new ArrayLists,
        each containing the iconIds of the TaskClass objects in the corresponding position of the corresponding TaskClass arraylist.
        These ArrayLists of ids are then used to populate the 4 listviews.
        */
        ArrayList<ArrayList<TaskClass>> listList = Paper.book(currentCommunity).read("listList", new ArrayList<ArrayList<TaskClass>>());
        if (listList.size() == 0){
            listList.add(new ArrayList<TaskClass>());
            listList.add(new ArrayList<TaskClass>());
            listList.add(new ArrayList<TaskClass>());
            listList.add(new ArrayList<TaskClass>());
        } else {

            for(TaskClass t:listList.get(0)){
                arrayListA.add(t.getIcon());
            }

            for(TaskClass t:listList.get(1)){
                arrayListB.add(t.getIcon());
            }

            for(TaskClass t:listList.get(2)){
                arrayListC.add(t.getIcon());
            }

            for(TaskClass t:listList.get(3)){
                arrayListD.add(t.getIcon());
            }
        }

        Integer[] intArrayA = new Integer[arrayListA.size()];
        for (int i = 0; i < arrayListA.size(); i++){
            intArrayA[i] =(Integer) arrayListA.get(i);

        }
        ArrayAdapter adapterA = new CustomArrayAdapter(getApplicationContext(),intArrayA);
        listViewA.setAdapter(adapterA);

        Integer[] intArrayB = new Integer[arrayListB.size()];
        for (int i = 0; i < arrayListB.size(); i++){
            intArrayB[i] =(Integer) arrayListB.get(i);

        }
        ArrayAdapter adapterB = new CustomArrayAdapter(getApplicationContext(),intArrayB);
        listViewB.setAdapter(adapterB);

        Integer[] intArrayC = new Integer[arrayListC.size()];
        for (int i = 0; i < arrayListC.size(); i++){
            intArrayC[i] =(Integer) arrayListC.get(i);

        }
        ArrayAdapter adapterC = new CustomArrayAdapter(getApplicationContext(),intArrayC);
        listViewC.setAdapter(adapterC);

        Integer[] intArrayD = new Integer[arrayListD.size()];
        for (int i = 0; i < arrayListD.size(); i++){
            intArrayD[i] =(Integer) arrayListD.get(i);

        }
        ArrayAdapter adapterD = new CustomArrayAdapter(getApplicationContext(),intArrayD);
        listViewD.setAdapter(adapterD);



    }

    //TODO: create a custom adapter that will display icons correctly
    public class CustomArrayAdapter extends ArrayAdapter{
        private final Context context;
        private final Integer[] values;

        public CustomArrayAdapter(Context context, Integer[] values) {
            super(context, -1, values);
            this.context = context;
            this.values = values;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View iconView = inflater.inflate(R.layout.iconlayout, parent, false);
            ImageView imageView = (ImageView) iconView.findViewById(R.id.listImageView);

            int s =(int) values[position];
            imageView.setImageResource(s);


            //get the device width, to calculate icon width, and then set icon width accordingly
            //TODO: setting icon width not working
            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Display display = wm.getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            int width =(size.x)/5;

            Uri uri = Uri.parse("android.resource://com.example.sta.tomov0/drawable/"+s);
            Picasso.with(context).load(uri).resize(width,width).fit().centerCrop().into(imageView);


            return iconView;
        }

    }
}
public类MainActivity扩展了AppCompatActivity{
图像视图;
ListView listViewA;
ArrayList ArrayList=新的ArrayList();
布尔aExists=false;
ListView listViewB;
ArrayList arrayListB=新的ArrayList();
布尔bExists=false;
ListView listViewC;
ArrayList ArrayList c=新的ArrayList();
布尔cExists=false;
ListView listViewD;
ArrayList ArrayList=新的ArrayList();
布尔德克斯特=假;
按钮添加按钮;
文本视图;
归档文件;
归档任务文件;
字符串currentCommunity=“Dep”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init(getApplicationContext());
tomoface=(ImageView)findViewById(R.id.tomoface);
设置图像资源(R.drawable.favorite15);
tomoText=(TextView)findViewById(R.id.TextView);
listViewA=(ListView)findViewById(R.id.listViewA);
listViewB=(ListView)findViewById(R.id.listViewB);
listViewC=(ListView)findViewById(R.id.listViewC);
listViewD=(ListView)findViewById(R.id.listViewD);
tomoFiles=getDir(“tomoFiles”,MODE_PRIVATE);
taskFiles=新文件(tomoFiles,“taskFiles”);
Display Display=getWindowManager().getDefaultDisplay();
点大小=新点();
display.getSize(size);
整数宽度=(size.x)/5;
ViewGroup.LayoutParams params=listViewA.getLayoutParams();
参数高度=宽度;
参数宽度=宽度;
listViewA.setLayoutParams(参数);
listViewB.setLayoutParams(参数);
listViewC.setLayoutParams(参数);
listViewD.setLayoutParams(参数);
/*
如果未保存任何数据,以下代码将创建一个(空)列表列表以保存TaskClass对象
4个子列表各代表一个类别。
如果保存了数据,下面的代码将检索该数据,并创建4个新的ArrayList,
在相应TaskClass arraylist的相应位置包含TaskClass对象的图标。
然后使用这些ID的ArrayList填充4个ListView。
*/
ArrayList

(这有点难以实现,而且还产生了其他问题-创建一个自定义视图类只是为了显示图标似乎有些过分?

在我的listview布局中为Imageview指定固定高度: 比如说

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_parent">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="120dp"
        android:id="@+id/listImageView"
        android:layout_alignParentTop="false"
        android:layout_alignParentLeft="false"
        android:layout_alignParentStart="false" />
</RelativeLayout>

我假设
@drawable/office38
是屏幕截图中显示的图像(占据整个屏幕)

尝试将此图像的尺寸设置为较小的值,例如:

android:layout_width="50dp"
android:layout_height="50dp"
我知道这可能不是你真正想要做的,但至少它会告诉你问题是否出在第一个ImageView上,并会为TextView和GridLayout在它下面腾出空间。这可能是因为可绘制的文件很大,而且由于你没有指定设置的宽度/高度或任何缩放选项,它会占用所有的空间它可以

另外,请看一看使用ImageView的不同缩放选项的描述。

明白了。 对不起,伙计们,这毕竟是个愚蠢的问题


事实证明,我的listview适配器工作正常。问题出在列表之外的imageview中(tomoface)-出于某种原因,我决定在运行时将其设置为不同的可绘制,但根本没有缩放,哈哈。

图标图像的尺寸是多少?文件的尺寸是512x512,但我尝试了一个大小调整的文件(我在paint中将其缩放了50%,然后将其添加回android studio)同样的问题我也试过了,但没有解决问题:/而且,它不允许我根据屏幕宽度动态设置图像大小,这是我理想的选择。它实际上是@drawable/Favorite15-这是我从flaticon.com上获得的一个图标。不过,该图标是在TaskClass中设置的(打印到日志中可以确认它是正确的)。我已经尝试将尺寸设置为较小的值,但没有任何效果。另外,我希望缩放实际的png,而不是imageview,以节省内存。