0

Итак, я хочу распечатать список фильмов из базы данных до ListView, и я использую ArrayAdapter, но когда я запускаю приложение, оно дает мне это.My ListView показывает объект, а не содержимое каждого объекта

enter image description here

Я думаю, что проблема в ArrayAdapter или ListView:

Код:

Моя модель класса;

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; 
    } 

}

В моей DBHandle у меня есть;

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. Рекомендуется: вы можете создать свой собственный адаптер вместо ArrayAdapter. Это очень распространено для сложных ListView. По сути, Адаптер определяет, какие части объекта Movie будут отображаться в ListView. Для настройки пользовательского ListView и адаптера существует множество обучающих программ в Интернете. Check out this one.
  2. Если вам нужно всего лишь показать название фильма, просто убедитесь, что вы передаете ArrayAdapter список объектов String, а не список объектов Movie. Создайте новый список и заполните его каждым из movie.getName().

Надеюсь, это поможет!

1

Вам нужно сделать новый макет для каждой строки ListView. Например, сделать файл макета с именем movie_item.xml в папке раскладки, а затем надуть его, когда представление создается в

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

} 

В принципе, вам потребуется пользовательский макет и адаптер. Простой ArrayAdapter (это только для строк) в этом случае не поможет.

2

Если вы используете список строк, например, чтобы не было проблем с использованием 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. –

 Смежные вопросы

  • Нет связанных вопросов^_^