Java 我的简单自定义listview显示错误的项,无法按预期工作。Can';我看不出有什么不对

Java 我的简单自定义listview显示错误的项,无法按预期工作。Can';我看不出有什么不对,java,android,list,listview,baseadapter,Java,Android,List,Listview,Baseadapter,我正在尝试创建如下内容: 然而,我遇到了一个问题。当我用适配器创建列表时,它应该是一个包含8项的列表。然而,它只是以随机顺序显示了其中的前4项两次。你看到我的代码有什么问题吗 public class MyActivity extends Activity{ String headers[]; String image_urls[]; List<MyMenuItem> menuItems; ListView mylistview; @Ov

我正在尝试创建如下内容:

然而,我遇到了一个问题。当我用适配器创建列表时,它应该是一个包含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);
    }

公共类MenuAdapter扩展BaseAdapter{
语境;
列表菜单项;
MenuAdapter(上下文,列表行项){
this.context=上下文;
this.menuItems=行项目;
}
@凌驾
public int getCount(){
返回menuItems.size();
}
@凌驾
公共对象getItem(int位置){
返回menuItems.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回menuItems.indexOf(getItem(position));
}
私有类视窗持有者{
图像视图菜单;
文本视图tvMenuHeader;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
LayoutInflater mInflater=(LayoutInflater)context.getSystemService(Activity.LAYOUT\u INFLATER\u SERVICE);
if(convertView==null){
convertView=mInflater.充气(R.layout.菜单项,空);
holder=新的ViewHolder();
holder.tvMenuHeader=(TextView)convertView.findViewById(R.id.tvMenuHeader);
holder.ivMenu=(ImageView)convertView.findViewById(R.id.ivMenuItem);
MyMenuItem row_pos=menuItems.get(位置);
毕加索。与(上下文)
.load(行位置getItem图像url())
.占位符(R.可绘制.空)
.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=(ViewHolder)convertView.getTag();
}
返回视图;
}
}

我认为这就是解决方案

else {


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

我之前也遇到过这个问题,这个问题对我很有效。

您只在
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;
        }

holder.tvMenuHeader.setText不应该在else循环之外吗?这对我很有用,谢谢。但是,有什么方法可以让菜单中的项目即使不在屏幕上也保持不变呢?当它们不在屏幕上时,它们会消失,当它们被卷回屏幕时,它会再次下载这些项目。是的..要优化
列表视图
,当项目不再可见时,它们会被销毁。但是毕加索默认情况下会缓存这些图像。因此,当你向上滚动时,它不会下载imgaes。它只是从缓存中加载图像。这是正确的做法。你是说图像没有被缓存吗?测试一下。滚动至列表底部,关闭互联网,然后滚动至顶部。它应该从缓存加载图像。项目正在缓存。但是,例如有8项。我向下滚动到底部。然后,当我向上滚动到第四项时,它加载第一项并立即移动到列表顶部,而不是继续向上滚动到线性。这很奇怪。您能否将代码张贴在将
适配器设置为
ListView
的位置。您是否在任何地方调用
notifydatasetchanged
else {


       holder = (ViewHolder) convertView.getTag();
       holder.tvMenuHeader.setText(row_pos.getItem_header());
    }
    @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;
        }