2016-12-27 57 views
0

所以我想從數據庫打印出一列電影到ListView,我使用的是ArrayAdapter,但是當我運行這個應用程序時,它給了我這個。我的ListView顯示的是對象而不是每個對象的內容

enter image description here

我認爲這個問題是在ArrayAdapterListView

代碼:

我的模型類;

public class Movie 
{ 
    private int id; 
    private String name; 
    private String genre; 
    private int year; 

    public long getId() 
    { 
     return id; 
    } 

    public void setId(int id) 
    { 
     this.id = id; 
    } 


    public String getName() 
    { 
     return name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 


    public String getGenre() 
    { 
     return genre; 
    } 

    public void setGenre(String genre) 
    { 
     this.genre = genre; 
    } 


    public int getYear() 
    { 
     return year; 
    } 

    public void setYear(int year) 
    { 
     this.year = year; 
    } 

}

在我的數據庫句柄我有;

private Movie cursorToMovie (Cursor cursor) 
    { 

    Movie movie = new Movie(); 
    movie.setId(cursor.getInt(0)); 
    movie.setName(cursor.getString(1)); 
    movie.setGenre(cursor.getString(2)); 
    movie.setYear(cursor.getInt(3)); 

    return movie; 
    } 


    public List<Movie> getAllMovies() 
    { 
     open(); 
     List<Movie> movieList = new ArrayList<>(); 
     Cursor cursor = db.query(Movie.TABLE_NAME, MovieAllColumns, null, null, null, null, null); 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) 
     { 
      Movie movie = cursorToMovie(cursor); 
      movieList.add(movie); 
      cursor.moveToNext(); 
     } 

     cursor.close(); 
     close(); 
     return movieList; 

    } 

而在我的MainActivity我有(它在這裏,我想,在GetAllMovies法)

public class MainActivity extends AppCompatActivity 
{ 

    MoviesRepository moviesRepository; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


    GetAllMovies(); 
    } 


    public void GetAllMovies() 
    { 
     moviesRepository = new MoviesRepository(this); 
     moviesRepository.open(); 

     List<Movie> movieList = moviesRepository.getAllMovies(); // Gets all Movies from the database 


     ArrayAdapter<Movie> adapter = new ArrayAdapter<Movie>(this, android.R.layout.simple_list_item_1, movieList); 


     ListView listView = (ListView) findViewById(R.id.ListViewMovie); 
     listView.setAdapter(adapter); 
    } 
} 

側面說明,當我調試它,我可以看到movieList正在被填充moviesRepository.getAllMovies()返回值,我可以看到所有電影的名稱,流派和年份。

+0

很高興默認情況下,'ArrayAdapter'將顯示一個數組的內容,這恰好是你的情況的對象。您想要擴展'ArrayAdapter'以便將字符串從對象中取出,然後將它們設置到您需要定製適配器的視圖 –

+0

中。爲了更好的理解閱讀使用BaseAdapter列表視圖的自定義。 – ADM

+0

我通過在電影類中製作一個toString來解決它 –

回答

2

通用ArrayAdapter和android.R.layout.simple_list_item_1是用於字符串列表而不是電影列表。它看起來像是取每個Movie對象並調用.toString()並將其放入列表視圖中。

根據你需要做什麼,你有幾個選擇。

  1. 建議:您可以創建自己的自定義Adapter而不是ArrayAdapter。這對於複雜的ListView非常常見。本質上,適配器決定了Movie對象的哪些部分將顯示在ListView中。有大量的教程在線設置自定義ListView和適配器。 Check out this one.
  2. 如果您只需顯示電影的標題,只需確保給ArrayAdapter一個String對象列表而不是Movie對象列表。創建一個新的List並用每個movie.getName()填充它。

希望這會有所幫助!

1

您需要爲ListView的每一行創建一個新的佈局。例如,使在佈局文件夾名爲movie_item.xml佈局文件,然後擡高它正在在

@Override 
public View getView(int postion, View convertView, ViewGroup parent) 
{ 

} 

基本上在創建視圖時,您將需要一個自定義佈局和適配器。一個簡單的ArrayAdapter(它僅適用於字符串)在這種情況下不會幫助你。

2

如果使用String的列表,例如,使用默認的ArrayAdapter沒有問題。 但是,如果你有一個複雜的對象,你必須創建自定義ArrayAdapter並重寫getView方法。 看看我的例子,這會解決你的問題。

public class MovieAdapter extends ArrayAdapter<Movie> { 

private List<Movie> moviesList; 

public MovieAdapter(Context context, int resource, List<Movie> moviesList) { 
    super(context, resource); 
    this.moviesList = moviesList; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Movie movie = getItem(position); 
    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.your_row_layout, parent, false); 
    } 
    TextView movieTitle = (TextView) convertView.findViewById(R.id.tvTitle); 
    TextView movieSubTitle = (TextView) convertView.findViewById(R.id.tvSubTitle); 
    movieTitle.setText(movie.getTitle); 
    movieSubTitle.setText(movie.getSubTitle); 
    return convertView; 
} 

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

}

希望它能幫助!

0

你的解決方案絕對是一種方式來做到這一點,但我認爲這是麻煩你讓自己的arrayAdapter。我發現的解決方案是你必須讓你自己toString在電影類的方法。

public String toString() 
{ 
    return name + ", " + genre + ", " + year; 
} 

這工作:)我現在

+0

很高興你的工作!我很確定它調用了toString(),但我不確定。除非我確定,否則我不想提出這個建議。只要每個列表項只有一個文本字符串,此解決方案就會很好。如果您需要添加額外的文本或圖像行,則需要使用自定義ArrayAdapter。 –

相關問題