3

タイトルにあるように、アイテム内のビューをクリックしたときのアイテムの正確な位置を知りたいです。

ArrayAdapterのgetView()メソッド内に次のコードがあるとします。

...
holder = new ViewHolder ();
holder.iconAction = (ImageView)convertView.findViewById (R.id.download_item_iconAction);
holder.iconAction.setOnClickListener (new View.OnClickListener(){
    @Override
    public void onClick (View v){
        //Item X is clicked
    }
});
...

onClick()内で、クリックされたビューvはわかりますが、アイテムの位置はわかりません。

トリックをしましょう。getView()がビューを作成するときに、ViewHolderに位置を保存します。

public View getView (int position, View convertView, ViewGroup parent){
    ViewHolder holder;
    if (convertView == null){
        holder = new ViewHolder ();
        holder.iconAction = (ImageView)convertView.findViewById (id);
        holder.iconAction.setOnClickListener (new View.OnClickListener(){
            @Override
            public void onClick (View v){
                int pos = (Integer)v.getTag ();
            }
        });
        holder.iconWait.setTag (position);

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

    ...
}

このコードは機能します...しかし常にではありません。リストをスクロールしてすべてのアイテムを表示する必要がある場合は、ビューがリサイクルされます。リストに10個の要素があり、5個だけが表示されているとします(表示とは、アイテムの1ピクセルの線が表示されている場合、このアイテムが表示されていることを意味します)。ここで、下にスクロールすると6番目の要素が表示されますが、最初の(0)は引き続き表示されます。もう少しスクロールすると、最初の要素が非表示になり、7番目の要素が表示されますが、この新しい要素のビューは最初の要素(0)のビューです。
位置を保存しています:0、1、2、3、4、5。7番目の要素(6)は位置0を保存します:間違っています。

クリックコールバックを取得する別の方法は、ListViewのOnItemClickListenerリスナーを使用することです。

listView = getListView ();
listView.setOnItemClickListener (new AdapterView.OnItemClickListener(){
    @Override
    public void onItemClick (AdapterView<?> parentView, View childView, int position, long id){
        ...
    }
});

下にスクロールすると正確な位置がわかりますが、この方法では、クリックされた子ビューに関係なく、アイテムがクリックされたときにコールバックを受け取ります。

ありがとう。

4

4 に答える 4

7

もうすぐそこにいます。必要なのは、if/else句の後にタグを設定することだけです。これは、ビューが再利用されたとき、および新しいものから作成されたときにタグが更新されるようにするためです。

例えば

    if (convertView == null){
        holder = new ViewHolder ();
        ...
    }else{
        holder = (ViewHolder)convertView.getTag ();
    }
 holder.iconWait.setTag (position);
于 2011-03-04T18:00:47.120 に答える
3

ローカル匿名クラスは、最終的なローカル変数を参照できます。

メソッドを次のようにposition変更して、最終版を作成しますgetView()

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

OnClickListener次に、 :内から位置を参照できます。

holder.iconAction.setOnClickListener (new View.OnClickListener(){
    @Override
    public void onClick (View v){
        ... use position here ...
    }
});
于 2011-03-04T18:03:16.447 に答える
0

2番目の答え(要素にタグを設定する)はholder.iconWait.setTag (position)、if / thenステートメントの外に移動した場合に正常に機能します。つまり、新しく膨らんだ行だけでなく、リサイクルされた行にもタグを設定する必要があります。

于 2011-03-04T18:00:05.700 に答える
0

また、onClickに渡すために他のデータを追加する必要があり、文字列でも機能しました。

holder.iconWait.setTag ("String data here");
于 2013-10-03T11:12:10.493 に答える