Java ListView中的ImageView忽略所有布局尺寸并填充整个屏幕
我正在尝试创建一组4个动态更新图标列表视图。 为此,我将4个listview放在一个gridview中,并为每个listview项使用一个自定义布局,其中包含一个imageview。我正在处理更改自定义适配器内的图标。我正在使用毕加索库来处理图标,我所有的图标都以.png文件的形式存储在本地的drawable中 我没有收到任何错误,但当我运行应用程序时,我得到的只是一个占据整个屏幕的图标。我在gridview上面有一个小的imageview和一个textview,其中包含图标列表,但一个图标甚至会将其推到一边 这是我的布局预览,以及在模拟器中运行的应用程序的屏幕截图。(如果我在手机上运行,结果是一样的) ,, (为没有嵌入而道歉,我是新加入的,还没有10个代表哈哈) 我已经尝试在运行时在自定义适配器内调整映像的大小。我已经尝试设置listview的最大宽度——在运行时(因为我想适应不同的屏幕尺寸)和xml文件中。我尝试在android studio之外调整源.png文件的大小。什么都没用 我的活动xml文件:Java ListView中的ImageView忽略所有布局尺寸并填充整个屏幕,java,android,android-layout,listview,Java,Android,Android Layout,Listview,我正在尝试创建一组4个动态更新图标列表视图。 为此,我将4个listview放在一个gridview中,并为每个listview项使用一个自定义布局,其中包含一个imageview。我正在处理更改自定义适配器内的图标。我正在使用毕加索库来处理图标,我所有的图标都以.png文件的形式存储在本地的drawable中 我没有收到任何错误,但当我运行应用程序时,我得到的只是一个占据整个屏幕的图标。我在gridview上面有一个小的imageview和一个textview,其中包含图标列表,但一个图标甚至
<?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,以节省内存。