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 に答える