I am trying to implement a custom listview using ArrayAdapter but all the items are not showing in the screen

怎甘沉沦 提交于 2019-12-12 03:59:00

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!