0

カスタムアダプターを実装し、リスト行に複数のビュー (ImageView、TextView) を持っています。これらのそれぞれにリスナーを設定したいと思います。

これは私がやったことです

if (containerRow == null)  { 
viewHolder.item.setOnClickListener(new OnImageViewClickListener(position, context, viewHolder));
}

これにより、(containerRow == null) のときに viewHolder.item.setOnClickListener が 1 回だけ呼び出されるため、OnImageViewClickListener で間違った位置が表示されます。複数のアイテム(ImageView、TextView)とその行数の多くのリスナーオブジェクトの作成以外の部分でこれを行う場合(私は正しいですか?)

私の理解では、ユーザーがクリックしたアイテムを取得できないため、ListViewのsetOnItemClickListenerではこれを達成できません。

これらの行項目にリスナーを実装し、正しい位置を受け取るためのきちんとした方法を提案してください。

4

2 に答える 2

1

これは、ListItem がリスト項目のデータを含む POJO である場合に機能するようです...

public class ListItemAdapter extends ArrayAdapter<ListItem>
{
    private static final String TAG    = "ListItemAdapter";
    private Activity            mContext;
    private int                 mLayoutResourceId;
    private List<ListItem> mItems = null;

static class ViewHolder
{
    public TextView  text1;
    public TextView  text2;
    public ImageView image;
}

public ListItemAdapter(Activity context, int textViewResourceId, List<ListItem> items)
{
    super(context, textViewResourceId, items);
    mContext = context;
    mLayoutResourceId = textViewResourceId;
    mItems = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    if (v == null)
    {
        LayoutInflater inflater = mContext.getLayoutInflater();
        v = inflater.inflate(mLayoutResourceId, parent, false);

        ViewHolder viewHolder = new ViewHolder();
        viewHolder.text1 = (TextView) v.findViewById(android.R.id.text1);
        viewHolder.text1.setOnClickListener(new ItemClickListener(position));
        viewHolder.text2 = (TextView) v.findViewById(android.R.id.text2);
        viewHolder.text2.setOnClickListener(new ItemClickListener(position));
        viewHolder.image = (ImageView) v.findViewById(android.R.id.icon);
        viewHolder.image.setOnClickListener(new ItemClickListener(position));

        v.setTag(viewHolder);
    }

    ListItem item = mItems.get(position);
    Log.v(TAG, item.toString());

    ViewHolder holder = (ViewHolder) v.getTag();

    String text = item.getText1();
    holder.text1.setText(text);

    text = item.getText2();
    holder.text2.setText(text);

    Drawable img = item.getImage();
    Log.v(TAG, "image : " + img);

    holder.image.setImageDrawable(img);
    return v;
}

class ItemClickListener implements View.OnClickListener
{
    int position;

    public ItemClickListener(int pos)
    {
        this.position = pos;
    }

    public void onClick(View v)
    {

        Toast.makeText(mContext, "Item clicked in row - " + position, Toast.LENGTH_SHORT).show();

    };
}

}

于 2013-03-12T01:14:50.823 に答える
1

各ビューのタグとして位置を設定し、クリック可能な各ビューにリスナーを設定します

リスナーを内部クラスとして定義し、ビューからタグを取得します

if (containerRow == null)  { 
    ....
    ....
    viewHolder.txv.setOnClickListener(clickListener);
    viewHolder.img.setOnClickListener(clickListener);
    .....
    .....
}else{
    viewHolder = containerRow.getTag();
}

viewHolder.txv.setTag(position);
viewHolder.img.setTag(position);

OnClickListener:

private View.OnClickListener clickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Integer position = (Integer) v.getTag();
        // you have the correct position
        switch(v.getId()){
        ......
        ......
        }
    }
};
于 2013-03-11T20:01:24.300 に答える