Разница между setOnItemClickListener и setOnClickListener

У меня есть пользовательский список массивов, который показывает данные из моей базы данных Sqlite. Моя проблема заключается в том, что когда я нажимаю на элемент (из представления списка, кроме 1-го элемента), он получает неправильные данные (из моей БД), но когда я реализовал Кнопка (внутри ListAdapter) с тем же кодом работала нормально.

В чем разница между «setOnItemClickListener» и «setOnClickListener» внутри «Списка массивов»? и как я могу это исправить?

Спасибо

public class ViewTeam  extends Activity {

private ListView listview;

TextView totalrecords;
DBHelper db;
public ArrayList<TeamModel> _teamlist = new ArrayList<TeamModel>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewteam);

    totalrecords = (TextView) findViewById(R.id.totalrecords1);
    listview = (ListView) findViewById(R.id.listview1);
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    _teamlist.clear();

    db = new DBHelper(getApplicationContext());
    db.getWritableDatabase();
    ArrayList<TeamModel> team_list = db.getTeams();

    for (int i = 0; i < team_list.size(); i++) {

        String tname = team_list.get(i).getTeamname();

        System.out.println("tname>>>>>" + tname);
        String topponent = team_list.get(i).getTeamopponent();
        String tdate = team_list.get(i).getTeamdate();

        TeamModel _TeamModel = new TeamModel();

        //_TeamModel.setIdno(tidno);
        _TeamModel.setTeamname(tname);
        _TeamModel.setTeamopponent(topponent);
        _TeamModel.setTeamdate(tdate);

        _teamlist.add(_TeamModel);
    }
    totalrecords.setText("Total Records :-" + _teamlist.size());
    listview.setAdapter(new ListAdapter(this));
    db.close();
}


private class ListAdapter extends BaseAdapter {
    LayoutInflater inflater;
    ViewHolder viewHolder;
    private android.widget.ListAdapter adapter;

    public ListAdapter(Context context) {
        // TODO Auto-generated constructor stub
        inflater = LayoutInflater.from(context);
    }

    @Override


    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        if (convertView == null) {

            convertView = inflater.inflate(R.layout.listviewrow, null);
            viewHolder = new ViewHolder();

            viewHolder.txt_name = (TextView) convertView
                    .findViewById(R.id.txtdisplayname);
            viewHolder.txt_opponent = (TextView) convertView
                    .findViewById(R.id.txtdisplayopponent);
            viewHolder.txt_date = (TextView) convertView
                    .findViewById(R.id.txtdisplaydate);

            convertView.setTag(viewHolder);

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

        viewHolder.txt_name.setText(_teamlist.get(position)
                .getTeamname().trim());
        viewHolder.txt_opponent.setText(_teamlist.get(position)
                .getTeamopponent().trim());
        viewHolder.txt_date.setText(_teamlist.get(position).
                getTeamdate().trim());

        final int temp = position;
        (convertView.findViewById(R.id.btn_update))
        .setOnClickListener(new OnClickListener() {

            public void onClick(View arg0) {

                String _teamname = String.valueOf(_teamlist
                        .get(temp).getTeamname());
                String _teamopponent = _teamlist.get(temp)
                        .getTeamopponent();
                String _teamdate = _teamlist.get(temp)
                        .getTeamdate();

                Intent intent = new Intent(ViewTeam.this,
                        AddReminder.class);

                Bundle bundle = new Bundle();
                bundle.putString("name1", _teamname);
                bundle.putString("opponent1", _teamopponent);
                bundle.putString("date1", _teamdate);
                intent.putExtras(bundle);
                startActivity(intent);  

            }
        });

        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override 
            public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
            { 
                String _teamname = String.valueOf(_teamlist
                        .get(temp).getTeamname());
                String _teamopponent = _teamlist.get(temp)
                        .getTeamopponent();
                String _teamdate = _teamlist.get(temp)
                        .getTeamdate();

                Intent intent = new Intent(ViewTeam.this,
                        AddReminder.class);

                Bundle bundle = new Bundle();
                bundle.putString("name1", _teamname);
                bundle.putString("opponent1", _teamopponent);
                bundle.putString("date1", _teamdate);
                intent.putExtras(bundle);
                startActivity(intent);              }
        });

        return convertView;
                }

    private class ViewHolder {
        TextView txt_name;
        TextView txt_opponent;
        TextView txt_date;

    }}

person Mounir Elfassi    schedule 13.12.2014    source источник


Ответы (1)


Вместо использования temp вы должны использовать аргумент position, переданный через OnItemClickListener, чтобы получить ваши данные.

          listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override 
        public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
        { 
            String _teamname = String.valueOf(_teamlist
                    .get(position).getTeamname());
            String _teamopponent = _teamlist.get(position)
                    .getTeamopponent();
            String _teamdate = _teamlist.get(position)
                    .getTeamdate();

            Intent intent = new Intent(ViewTeam.this,
                    AddReminder.class);

            Bundle bundle = new Bundle();
            bundle.putString("name1", _teamname);
            bundle.putString("opponent1", _teamopponent);
            bundle.putString("date1", _teamdate);
            intent.putExtras(bundle);
            startActivity(intent);              }
    });
person Dalija Prasnikar    schedule 13.12.2014
comment
СПАСИБО @dalija-prasnikar Теперь все в порядке. - person Mounir Elfassi; 13.12.2014