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

时间:2016-02-22 15:17:03

标签: java android android-layout listview

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

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

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

previewrunning

(道歉没有嵌入,我是SO的新手,而且还没有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>

我的列表视图布局:

<?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;
        }

    }
}

注意:我有一个返回arraylists的自定义数据管理类。这是单独测试并且工作正常。被提供给适配器的arraylists是可绘制引用的int arraylists。

帮助!我究竟做错了什么?我整天都在搜索SO并尝试不同的事情。在这些问题中发布的解决方案对T-T没有帮助: How to set ImageView width in android ListView? ImageView in ListView that expands maximum width (这有点难以实现,只是创建了其他问题 - 为了显示图标而创建自定义视图类似乎有点过分了吗?)

3 个答案:

答案 0 :(得分:0)

为我的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>

答案 1 :(得分:0)

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

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

android:layout_width="50dp"
android:layout_height="50dp"

我知道这可能不是你实际想做的事情,但至少它会告诉你问题是否与第一个ImageView有关,并将为它释放TextView和GridLayout下面的空间。可能是drawable是庞大的,并且由于您没有指定设置的宽度/高度或任何缩放选项,它会占用它所能占用的所有空间。

另外,请查看http://developer.android.com/reference/android/widget/ImageView.html#attr_android:scaleType,其中介绍了使用ImageView的不同缩放选项。

答案 2 :(得分:0)

GOT IT。 对不起大家。毕竟这是一个非常愚蠢的问题。

我的listview适配器运行正常。问题出在imageview中之外的列表(tomoface) - 由于某种原因,我决定在运行时将它设置为不同的drawable,并且根本没有缩放它哈哈。 / p>