0

ListView我的自定义适配器有一些问题,当单击一个项目时会获得错误的位置。

基本上,当单击该项目时,适配器中的项目名称会发送到不同的活动,并且在滚动之前可以正常工作。但是,仅在滚动时显示的任何项目都不会发送正确的位置;似乎他们在滚动之前发送了视图中项目的相应位置(这对视图回收有意义)。

ListView可能不会有很多项目,所以如果可以禁用视图回收它不应该是一个大问题,但我宁愿解决这个问题,以便我可以滚动并发送正确的位置。

我是一个非常新的 android 开发人员,这是我制作的第一个应用程序,所以我从在线教程中获得了这个自定义适配器,如果它看起来有点奇怪,请道歉。

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

    ViewHolder holder = null;
    Log.v("ConvertView", String.valueOf(position));

    if (convertView == null) {
        LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.country_info, null);

        holder = new ViewHolder();
        holder.item = ((TextView)convertView.findViewById(R.id.infoBox));
        convertView.setTag(holder);

                holder.item.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Country country = countryList.get(position);                        
                        String s = (String)(country.getName());
                        Intent i = new Intent(SecondScreenActivity.this, ThirdScreenActivity.class);
                        i.putExtra("position", s);
                        startActivity(i);
                    }
                });

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

            Country country = countryList.get(position);
            holder.item.setText(country.getName());
            holder.favourite.setChecked(country.isSelected());
            holder.favourite.setTag(country);

            return convertView;

        }

注意:此代码可能会丢失/这里和那里有几个额外的括号,因为此方法还会检查项目是否已选中/未选中复选框,并且我删除了该代码以更容易解决此问题。

感谢您的帮助!

4

2 回答 2

1

适配器中的视图被重用于列表中的不同项目,因此它们不够可靠,无法完成您正在尝试做的事情。尝试在您正在使用的活动中的 listView 上设置侦听器,就像这样。

    listView.setOnItemClickListener(new OnItemClickListener()
    {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id)
        {
                  Country country = (Country) listView.getAdapter().getItem(position);                        
                    String s = (String)(country.getName());
                    Intent i = new Intent(SecondScreenActivity.this, ThirdScreenActivity.class);
                    i.putExtra("position", s);
                    startActivity(i);
        }
    });
于 2013-10-24T20:59:18.763 回答
0

我的两分钱是,由于您仅在 convertView 为 null 时设置 OnClickListener 它只记住所述视图的初始绑定最终 int 位置,仅当它最初是从布局创建时,而不是在它被回收之后。

尝试将其设置在if{}块之外,以便它绑定视图的当前位置,无论它是否被回收。

if (convertView == null) {
    LayoutInflater vi = (LayoutInflater)
                        getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = vi.inflate(R.layout.country_info, null);

    holder = new ViewHolder();
    holder.item = ((TextView)convertView.findViewById(R.id.infoBox));
    convertView.setTag(holder);
} else {
    holder = (ViewHolder) convertView.getTag();
}
holder.item.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Country country = countryList.get(position);                        
        String s = (String)(country.getName());
        Intent i = new Intent(SecondScreenActivity.this, 
                              ThirdScreenActivity.class);
        i.putExtra("position", s);
        startActivity(i);
    }
});

这个,差不多。

于 2013-10-24T20:52:22.013 回答