列表视图与自定义布局

时间:2017-09-06 15:24:50

标签: android

我创建了一个包含自定义行的列表,但我不知道该怎么回事。

这是主要活动

package com.example.fahdmana.lest;
    public class MainActivity extends AppCompatActivity{
    ListView listView;

    final int[] movie_poster_resouce = {
        R.drawable.apple,
        R.drawable.banana,
        R.drawable.cherry,
        R.drawable.mango,
        R.drawable.orange,
        R.drawable.strawberry,
        R.drawable.tomato
    }; 

    String[]movies_title;
    String[]movies_rating;
    MovieAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView)findViewById(R.id.List1);
        movies_title = getResources().getStringArray(R.array.Movies_names);
        movies_rating = getResources().getStringArray(R.array.Ratings);

        int i =0;
        for (String titles : movies_title){
            MovieDataProvider dataProvider = 
                    new MovieDataProvider(movie_poster_resouce[i],titles,movies_rating[i]);
            i++;
            adapter = new MovieAdapter(getApplicationContext(),R.layout.row);
            listView.setAdapter(adapter);
            adapter.add(dataProvider);
        }
    }
}

这是我的适配器

package com.example.fahdmana.lest;

import android.content.Context;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;


public class MovieAdapter extends ArrayAdapter {

    final List list = new ArrayList();

    public MovieAdapter(  Context context,   int resource) {
        super(context, resource);
    }

    static class DataHandeler{
        ImageView poster;
        TextView title;
        TextView rating;
    }


    @Nullable @Override
    public void add( Object object) {
        super.add(object);
        list.add(object);
    }


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

    @Nullable @Override
    public Object getItem(int position) {
        return this.list.get(position);
    }

    @Nullable @Override
    public View getView (int position,
            @NonNull  View convertView,
            @NonNull ViewGroup parent) {
        View row;
        row = convertView;
        DataHandeler handler;

        if (convertView ==null) {
            LayoutInflater inflater =  (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.row, parent, false);
            handler = new DataHandeler();
            handler.poster = (ImageView) row.findViewById(R.id.image_view);
            handler.title = (TextView) row.findViewById(R.id.movie_title);
            handler.rating = (TextView) row.findViewById(R.id.movie_rating);
            row.setTag(handler);
        } else {
            handler = (DataHandeler) row.getTag();
        }

        MovieDataProvider dataProvider;
        dataProvider = (MovieDataProvider)this.getItem(position);

        handler.poster.setImageResource(dataProvider.
        getMovie_poster_resource());

        //here i get some warning
        handler.title.setText(dataProvider.getMovie_title());
        handler.rating.setText(dataProvider.getMovie_rating());

        return row;
}

}

这是我的数据提供者

 package com.example.fahdmana.lest;

 public class MovieDataProvider {
     private int movie_poster_resource;
     private String movie_title;
     private String movie_rating;

     public MovieDataProvider(int movie_poster_resource, String movie_title, String movie_rating){
         this.setMovie_poster_resource(movie_poster_resource);
         this.setMovie_title(movie_title);
         this.setMovie_rating(movie_rating);
     }

     public int getMovie_poster_resource() {
         return movie_poster_resource;
     }

     public void setMovie_poster_resource(int movie_poster_resource) {
         this.movie_poster_resource = movie_poster_resource;
     }

    public String getMovie_title() {
        return movie_title;
    }

    public void setMovie_title(String movie_title) {
        this.movie_title = movie_title;
    }

    public String getMovie_rating() {
        return movie_rating;
    }

    public void setMovie_rating(String movie_rating) {
        this.movie_rating = movie_rating;
    }
}

1 个答案:

答案 0 :(得分:0)

我很确定这是你的问题。

   for (String titles : movies_title){
        MovieDataProvider dataProvider = 
                new MovieDataProvider(movie_poster_resouce[i],titles,movies_rating[i]);
        i++;
        adapter = new MovieAdapter(getApplicationContext(),R.layout.row);
        listView.setAdapter(adapter);
        adapter.add(dataProvider);
    }

你的主要活动中有这个。你真的不想循环遍历你的列表并在那个循环里面调用你的适配器。

你想创建一个对象列表,然后调用适配器....就像这样......

   ListViewAdapterResults adapter = new ListViewAdapterResults(listView.getContext(), scheduleModelList);
    listView.setAdapter(adapter);

其中scheduleModelList是我的对象列表。希望这是有道理的。 快乐的编码。

查看代码,您可能想要做类似的事情......

把它放在顶部

List<MovieDataProvider> list;

然后在你的setContentView

之后
list = new ArrayList<>();

将此循环替换为:

for (int i = 0; i < movie_title.length; i++) {
    list.add(new MovieDataProvider(movie_poster_resouce[i],titles,movies_rating[i]));
}
MovieAdapter adapter = new MovieAdapter(listView.getContext(), list);
listView.setAdapter(adapter);

如果您有任何问题,请与我们联系。

MovieAdapter(这是你的适配器类)

listView .getContext()(这是您的listview的ID [您可能将其命名为其他内容])

自从我使用Arrays已经很长时间了......你必须在for循环中加入+1或-1。 (我&lt; movie_title.length [可能+1或-1]