问题
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>
Screenshots (Android and Logcat):- http://imgur.com/a/816Q1
The ArrayAdapter is only showing the last value from strings.xml and the last image from img array. Unable to display all the images and text.
There is an error in line images.setImageResource(imgs[position]) as NullPointerException. Logcat is attached in the screenshot.
回答1:
I think that your issue might be in getView method or your adapter. You should use 'row' view to find child controls.
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);
回答2:
You need add LayoutManager to you listView/RecyclerView. Before set adapter.
how do:
rvCategories.setHasFixedSize(true);
rvCategories.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
Remember, we have more layouts managers..
And you need initialization of your components. Detail: 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);
回答3:
I think problem is in your getView() method. You forgot to put object of your view for find IDs.
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);
来源:https://stackoverflow.com/questions/42771902/i-am-trying-to-implement-a-custom-listview-using-arrayadapter-but-all-the-items