从ArrayList填充ListView显示数据库行引用而不是行数据

时间:2014-12-10 00:45:20

标签: android android-listview android-arrayadapter

我从db获取行作为ArrayList。我想使用两列中的数据来填充列表视图。

到目前为止我所做的只显示了?行参考? (com.app.Poster@2349049)

ListView listView = (ListView) findViewById(R.id.poster_list_view);
MySQLiteHelper db = new MySQLiteHelper(this);
List<Poster> posters = db.getAllPosters();

ArrayAdapter<Poster> listAdapter = new ArrayAdapter<Poster>(this, android.R.layout.simple_list_item_1, posters);

listView.setAdapter(listAdapter);

我想也许我想循环ArrayList并将每一行添加到适配器

for (Poster p : posters){
    listAdapter.add(p.getPosterTitle());
}

显然,适配器只需要一个我认为的对象。我应该为此定制适配器吗?我认为这会容易得多。

这是我的海报类

public class Poster {
    private int posterId;
    private int categoryId;
    private int eventId;
    private String presenterFname;
    private String presenterLname;
    private String posterTitle;
    private String posterSynopsis;
    private String posterFilename;
    private String posterRemoteLocation;

    public Poster(int pid, int cid, int eid, String prf, String prl, String pt, String ps, String pfn, String fl){
        posterId = pid;
        categoryId = cid;
        eventId = eid;
        presenterFname = prf;
        presenterLname = prl;
        posterTitle = pt;
        posterSynopsis = ps;
        posterFilename = pfn;
        posterRemoteLocation = fl;
    }
    public int getPosterID(){
        return this.posterId;
    }
    public int getCatID(){
        return this.categoryId;
    }
    public int getEventId(){
        return this.eventId;
    }
    public String getPresenterFname(){
        return this.presenterFname;
    }
    public String getPresenterLname(){
        return this.presenterLname;
    }
    public String getPosterTitle(){
        return this.posterTitle;
    }
    public String getPosterSynopsis(){
        return this.posterSynopsis;
    }
    public String getPosterFilename(){
        return this.posterFilename;
    }
    public String getPosterRemote(){
        return this.posterRemoteLocation;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以在下面找到适合您需求的自定义适配器的类。这将与您尝试在代码示例中使用常规方法的方式非常相似。

此方法可让您更灵活地显示信息。

您可以在getView方法中设置自定义布局。以及从传入的项目编号中设置视图中的值。

public class PosterListAdapter extends BaseAdapter {

    private final ArrayList<Poster> listItems;
    private final LayoutInflater inflater;

    public PosterListAdapter(ArrayList<Poster> listItems, LayoutInflater inflater) {
        this.listItems = listItems;
        this.inflater = inflater;
    }

    @Override
    public int getCount() {
        return this.listItems.size();
    }

    @Override
    public Film getItem(int i) {
        return this.listItems.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        if (view == null) {
            view = inflater.inflate(R.layout.poster_layout, viewGroup, false);
        }

        Poster item = this.listItems.get(i);

        TextView posterTitle = ((TextView) view.findViewById(R.id.poster_layout_title));

        posterTitle.setText(item.getTitle());

        ImageView posterImage = ((ImageView) view.findViewById(R.id.poster_layout_image));

        posterImage.setImageResource(R.drawable.apple);
        return view;
    }
}

下面是一个简单的布局,可以与上面的数组适配器一起用于列表视图项。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/poster_layout_image"
        android:layout_width="50dp"
        android:layout_height="75dp"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/poster_layout_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/poster_layout_image"
        android:textColor="@color/text"
        android:textSize="20sp" />
</RelativeLayout>