我的简单自定义列表视图显示错误的项目,不按预期工作。看不出有什么不对

时间:2014-10-11 00:39:31

标签: java android list listview baseadapter

我正在尝试创建这样的内容:https://i.stack.imgur.com/l8ZOc.png

然而,我遇到了一个问题。当我使用我的适配器创建列表时,它应该是一个包含8个项目的列表。但是,它只是以随机顺序显示这些项目中的前4个。你看到我的代码出了什么问题吗?

public class MyActivity extends Activity{

    String headers[];
    String image_urls[];

    List<MyMenuItem> menuItems;
    ListView mylistview;

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

        menuItems = new ArrayList<MyMenuItem>();
        headers = getResources().getStringArray(R.array.header_names);
        image_urls = getResources().getStringArray(R.array.image_urls);


        for (int i = 0; i < headers.length; i++) {
            MyMenuItem item = new MyMenuItem(headers[i], image_urls[i]);
            menuItems.add(item);

        }

        mylistview = (ListView) findViewById(R.id.list);
        MenuAdapter adapter = new MenuAdapter(this, menuItems);
        mylistview.setAdapter(adapter);
        mylistview.setOnItemClickListener(this);
    }

public class MyMenuItem {

    private String item_header;
    private String item_image_url;

    public MyMenuItem(String item_header, String item_image_url){
        this.item_header=item_header;
        this.item_image_url=item_image_url;
    }

    public String getItem_header(){
        return item_header;
    }

    public void setItem_header(String item_header){
        this.item_header=item_header;
    }

    public String getItem_image_url(){
        return item_image_url;
    }

    public void setItem_image_url(String item_image_url){
        this.item_image_url=item_image_url;
    }


}

public class MenuAdapter extends BaseAdapter{

    Context context;
    List<MyMenuItem> menuItems;

    MenuAdapter(Context context, List<MyMenuItem> rowItems) {
        this.context = context;
        this.menuItems = rowItems;
    }

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

    @Override
    public Object getItem(int position) {
        return menuItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return menuItems.indexOf(getItem(position));
    }

    private class ViewHolder {
        ImageView ivMenu;
        TextView tvMenuHeader;
    }



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

        ViewHolder holder = null;

        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.menu_item, null);
            holder = new ViewHolder();

            holder.tvMenuHeader = (TextView) convertView.findViewById(R.id.tvMenuHeader);
            holder.ivMenu = (ImageView) convertView.findViewById(R.id.ivMenuItem);

            MyMenuItem row_pos = menuItems.get(position);

            Picasso.with(context)
                    .load(row_pos.getItem_image_url())
                    .placeholder(R.drawable.empty)
                    .error(R.drawable.error)
                    .into(holder.ivMenu);

            holder.tvMenuHeader.setText(row_pos.getItem_header());

            Log.e("Test", "headers:" + row_pos.getItem_header());

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        return convertView;
    }

}

2 个答案:

答案 0 :(得分:0)

我认为这是解决方案

else {


       holder = (ViewHolder) convertView.getTag();
       holder.tvMenuHeader.setText(row_pos.getItem_header());
    }

我之前也遇到过这个问题,这个问题适合我。

答案 1 :(得分:0)

仅在convertView为空时设置数据。因此,当它不为空时,列表项会使用先前列表项的数据进行充气。 getView应该是这样的

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

            ViewHolder holder = null;

            LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.menu_item, null);
                holder = new ViewHolder();

                holder.tvMenuHeader = (TextView) convertView.findViewById(R.id.tvMenuHeader);
                holder.ivMenu = (ImageView) convertView.findViewById(R.id.ivMenuItem); 
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            MyMenuItem row_pos = menuItems.get(position);

                Picasso.with(context)
                        .load(row_pos.getItem_image_url())
                        .placeholder(R.drawable.empty)
                        .error(R.drawable.error)
                        .into(holder.ivMenu);

                holder.tvMenuHeader.setText(row_pos.getItem_header());

                Log.e("Test", "headers:" + row_pos.getItem_header());
            return convertView;
        }