我正在尝试使用 ArrayAdapter 实现自定义列表视图,但所有项目都没有显示在屏幕上
I am trying to implement a custom listview using ArrayAdapter but all the items are not showing in the screen
MainActivity.java
public class MainActivity extends Activity {
ListView list;
String[] titles;
String[] description;
int imgs[]={R.drawable.facebook,R.drawable.instagram,R.drawable.twitter,R.drawable.google};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Resources res = getResources();
titles = res.getStringArray(R.array.titles);
description = res.getStringArray(R.array.description);
list = (ListView) findViewById(R.id.list1);
MyAdapter adapter = new MyAdapter(this,titles,imgs,description);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(),Integer.toString(position),Toast.LENGTH_LONG).show();
}
});
}
class MyAdapter extends ArrayAdapter<String> {
Context context;
String myTitles[];
String myDescription[];
int[] imgss;
MyAdapter(Context c, String[] titles, int[] img, String[] description) {
super(c,R.layout.row,R.id.text1,titles);
this.context=c;
this.imgss=img;
this.myTitles=titles;
this.myDescription=description;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = layoutInflater.inflate(R.layout.row, parent, false);
ImageView images = (ImageView) findViewById(R.id.logo);
TextView myTitle = (TextView) findViewById(R.id.text1);
TextView myDescription = (TextView) findViewById(R.id.text2);
images.setImageResource(R.drawable.facebook);
images.setImageResource(imgs[position]);
myTitle.setText(titles[position]);
myDescription.setText(description[position]);
return row;
}
}
}
activity_main.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:padding="16dp"
tools:context="com.apakdroid.customlistview.MainActivity" >
<ListView
android:id="@+id/list1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true" />
</RelativeLayout>
row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:padding="5dp"
android:id="@+id/logo"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textColor="#33CC33"
android:id="@+id/text1"
android:layout_marginTop="5dp"
android:layout_marginLeft="10dp"
android:text="Medium Text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text2"
android:layout_marginLeft="10dp"
android:text="TextView" />
</LinearLayout>
strings.xml
<resources>
<string name="app_name">Custom ListView</string>
<string-array name="titles">
<item>Facebook</item>
<item>Instagram</item>
<item>Twitter</item>
<item>Google</item>
</string-array>
<string-array name="description">
<item>Facebook Description</item>
<item>Instagram Description</item>
<item>Twitter Description</item>
<item>Google Description</item>
</string-array>
屏幕截图(Android 和 Logcat):-
http://imgur.com/a/816Q1
ArrayAdapter 仅显示来自 strings.xml 的最后一个值和来自 img 数组的最后一个图像。无法显示所有图片和文字。
第 images.setImageResource(imgs[position]) 行出现 NullPointerException 错误。
Logcat附在截图里
我认为您的问题可能出在 getView 方法或您的适配器上。
您应该使用 'row' 视图来查找子控件。
View row = layoutInflater.inflate(R.layout.row, parent, false);
ImageView images = (ImageView) row.findViewById(R.id.logo);
TextView myTitle = (TextView) row.findViewById(R.id.text1);
TextView myDescription = (TextView) row.findViewById(R.id.text2);
您需要为您添加 LayoutManager listView/RecyclerView。在设置适配器之前。
怎么做:
rvCategories.setHasFixedSize(true);
rvCategories.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
记住,我们有更多的布局管理器..
并且您需要初始化您的组件。
详情:row.findViewById.
View row = layoutInflater.inflate(R.layout.row, parent, false);
ImageView images = (ImageView) row.findViewById(R.id.logo);
TextView myTitle = (TextView) row.findViewById(R.id.text1);
TextView myDescription = (TextView) row.findViewById(R.id.text2);
我认为问题出在您的 getView() 方法中。
您忘记为查找 ID 添加视图对象。
View row = layoutInflater.inflate(R.layout.row, parent, false);
ImageView images = (ImageView) row.findViewById(R.id.logo);
TextView myTitle = (TextView) row.findViewById(R.id.text1);
TextView myDescription = (TextView) row.findViewById(R.id.text2);
MainActivity.java
public class MainActivity extends Activity {
ListView list;
String[] titles;
String[] description;
int imgs[]={R.drawable.facebook,R.drawable.instagram,R.drawable.twitter,R.drawable.google};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Resources res = getResources();
titles = res.getStringArray(R.array.titles);
description = res.getStringArray(R.array.description);
list = (ListView) findViewById(R.id.list1);
MyAdapter adapter = new MyAdapter(this,titles,imgs,description);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(),Integer.toString(position),Toast.LENGTH_LONG).show();
}
});
}
class MyAdapter extends ArrayAdapter<String> {
Context context;
String myTitles[];
String myDescription[];
int[] imgss;
MyAdapter(Context c, String[] titles, int[] img, String[] description) {
super(c,R.layout.row,R.id.text1,titles);
this.context=c;
this.imgss=img;
this.myTitles=titles;
this.myDescription=description;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = layoutInflater.inflate(R.layout.row, parent, false);
ImageView images = (ImageView) findViewById(R.id.logo);
TextView myTitle = (TextView) findViewById(R.id.text1);
TextView myDescription = (TextView) findViewById(R.id.text2);
images.setImageResource(R.drawable.facebook);
images.setImageResource(imgs[position]);
myTitle.setText(titles[position]);
myDescription.setText(description[position]);
return row;
}
}
}
activity_main.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:padding="16dp"
tools:context="com.apakdroid.customlistview.MainActivity" >
<ListView
android:id="@+id/list1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true" />
</RelativeLayout>
row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:padding="5dp"
android:id="@+id/logo"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textColor="#33CC33"
android:id="@+id/text1"
android:layout_marginTop="5dp"
android:layout_marginLeft="10dp"
android:text="Medium Text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text2"
android:layout_marginLeft="10dp"
android:text="TextView" />
</LinearLayout>
strings.xml
<resources>
<string name="app_name">Custom ListView</string>
<string-array name="titles">
<item>Facebook</item>
<item>Instagram</item>
<item>Twitter</item>
<item>Google</item>
</string-array>
<string-array name="description">
<item>Facebook Description</item>
<item>Instagram Description</item>
<item>Twitter Description</item>
<item>Google Description</item>
</string-array>
屏幕截图(Android 和 Logcat):- http://imgur.com/a/816Q1
ArrayAdapter 仅显示来自 strings.xml 的最后一个值和来自 img 数组的最后一个图像。无法显示所有图片和文字。
第 images.setImageResource(imgs[position]) 行出现 NullPointerException 错误。 Logcat附在截图里
我认为您的问题可能出在 getView 方法或您的适配器上。 您应该使用 'row' 视图来查找子控件。
View row = layoutInflater.inflate(R.layout.row, parent, false);
ImageView images = (ImageView) row.findViewById(R.id.logo);
TextView myTitle = (TextView) row.findViewById(R.id.text1);
TextView myDescription = (TextView) row.findViewById(R.id.text2);
您需要为您添加 LayoutManager listView/RecyclerView。在设置适配器之前。
怎么做:
rvCategories.setHasFixedSize(true);
rvCategories.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
记住,我们有更多的布局管理器..
并且您需要初始化您的组件。 详情:row.findViewById.
View row = layoutInflater.inflate(R.layout.row, parent, false);
ImageView images = (ImageView) row.findViewById(R.id.logo);
TextView myTitle = (TextView) row.findViewById(R.id.text1);
TextView myDescription = (TextView) row.findViewById(R.id.text2);
我认为问题出在您的 getView() 方法中。 您忘记为查找 ID 添加视图对象。
View row = layoutInflater.inflate(R.layout.row, parent, false);
ImageView images = (ImageView) row.findViewById(R.id.logo);
TextView myTitle = (TextView) row.findViewById(R.id.text1);
TextView myDescription = (TextView) row.findViewById(R.id.text2);