Android 列表视图单击获取错误的项

Android 列表视图单击获取错误的项,android,listview,adapter,Android,Listview,Adapter,我有一个从适配器充气的列表视图。 当我点击其中一个按钮时,我得到了错误的项目。 在我添加whatsApp按钮之前,它一直工作正常 这是我的适配器: public class shawarmaddapter extends ArrayAdapter<shawarma> { String nname; double lat,lon; public shawarmaddapter(Context context, List<shawarma> resource) {

我有一个从适配器充气的列表视图。 当我点击其中一个按钮时,我得到了错误的项目。 在我添加
whatsApp
按钮之前,它一直工作正常

这是我的适配器:

public class shawarmaddapter  extends ArrayAdapter<shawarma> {
String nname;
double lat,lon;

public shawarmaddapter(Context context, List<shawarma> resource) {
    super(context,0, resource);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {

   ....

    if (convertView==null)
    {
        convertView= LayoutInflater.from(getContext()).inflate(R.layout.shawarmaddapter,parent,false);
    }
   ....
    waze= (ImageButton)convertView.findViewById(R.id.adapterWazeBTN);
    whats = (ImageButton)convertView.findViewById(R.id.whats);
    locName=name.getText().toString();


....
    nname = sh1.getName();
    name.setText(sh1.getName());
....

    if (sh1.getParking()==1)
        park.setChecked(true);
    else
        park.setChecked(false);

    rate.setRating((float) sh1.getRank());
    rate.setIsIndicator(true);
    listener lis = new listener();
    waze.setOnClickListener(lis);
    whats.setOnClickListener(lis);
    lat=   sh1.getLat();
    lon= sh1.getLon();

    return convertView;
}
如何更改此项以获得正确的项目?

您可以尝试这种方法

package com.example.listview;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.content.ClipData.Item;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {
    ListView list;
    ArrayList<String> data;
    ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list=(ListView)findViewById(R.id.listView1);
        data=new ArrayList<String>();
        data.add("List item 1");
        data.add("List item 2");
        data.add("List item 3");
        data.add("List item 4");
        adapter=new ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,data);
        list.setAdapter(adapter);

       list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {

            String s= Integer.toString(arg2) ; //here arg2 selects the list item
            Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
            // TODO Auto-generated method stub

        }
    });
    }




    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
package com.example.listview;
导入java.util.ArrayList;
导入android.os.Bundle;
导入android.app.Activity;
导入android.content.ClipData.Item;
导入android.view.Menu;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.Toast;
公共类MainActivity扩展了活动{
列表视图列表;
阵列列表数据;
阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
列表=(ListView)findViewById(R.id.listView1);
数据=新的ArrayList();
数据。添加(“列表项目1”);
数据。添加(“列表项目2”);
数据。添加(“列表项目3”);
数据。添加(“清单项目4”);
adapter=newarrayadapter(getApplicationContext(),android.R.layout.simple\u list\u item\u 1,数据);
list.setAdapter(适配器);
list.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
字符串s=Integer.toString(arg2);//此处arg2选择列表项
Toast.makeText(getApplicationContext(),s,Toast.LENGTH_SHORT).show();
//TODO自动生成的方法存根
}
});
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
}
试试这个:

class listener implements View.OnClickListener{

    shawarma sh;

    listener(shawarma sh1) {
        sh = sh1;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.adapterWazeBTN:
                Log.i("a7", "button clicked");

              //  Log.i("a7", sh.getLat()+" lat,  "+sh.getLon()+"  lon"+ "distance: "+ sh.getDistance());

                try
                {
                    String url = "waze://?ll="+sh.getLat()+","+sh.getLon()+"&navigate=yes";
                    Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( url ) );
                    shawarmaList.con. startActivity( intent );
                }
                catch ( ActivityNotFoundException ex  )
                {
                    Intent intent =
                            new Intent( Intent.ACTION_VIEW, Uri.parse( "market://details?id=com.waze" ) );
                    shawarmaList.con.startActivity(intent);
                }
                catch (Exception ex)
                {
                    Log.i("a7",ex.toString());
                }


                break;
            case R.id.whats:
                Intent sendIntent = new Intent();
                sendIntent.setAction(Intent.ACTION_SEND);
                sendIntent.putExtra(Intent.EXTRA_TEXT, "do you want to Join me to "+sh.getName()+"?");
                sendIntent.setType("text/plain");

                try {
                    Toast.makeText(shawarmaList.con.getApplicationContext(),sh.getName(),Toast.LENGTH_SHORT).show();
                    shawarmaList.con.startActivity(sendIntent);
                } catch (Exception e) {
                    Log.i("a7",e.getMessage());
                }

                break;


        }
    }
}
然后,在创建侦听器时,只需按如下方式传递shwarma对象:

listener lis = new listener(sh1);
而不是

waze.setOnClickListener(lis);
whats.setOnClickListener(lis);
试试这个

waze.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        try {
            String url = "waze://?ll="+sh1.getLat()+","+sh1.getLon()+"&navigate=yes";
            Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( url ) );
            shawarmaList.con. startActivity( intent );
        }  catch ( ActivityNotFoundException ex  ) {
            Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( "market://details?id=com.waze" ) );
            shawarmaList.con.startActivity(intent);
        } catch (Exception ex) {
            Log.i("a7",ex.toString());
        }
    }
});

whats.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        try {
            Intent sendIntent = new Intent();
            sendIntent.setAction(Intent.ACTION_SEND);
            sendIntent.putExtra(Intent.EXTRA_TEXT, "do you want to Join me to "+sh1.getName()+"?");
            sendIntent.setType("text/plain");

            Toast.makeText(shawarmaList.con.getApplicationContext(),sh1.getName(),Toast.LENGTH_SHORT).show();
            shawarmaList.con.startActivity(sendIntent);
        } catch (Exception e) {
            Log.i("a7",e.getMessage());
        }
    }
});
您将希望将
sh1
作为最终版本

final shawarma sh1 = getItem(position);

您没有将项目的索引发送给侦听器。侦听器如何知道您单击了哪个索引?您还需要在适配器上使用ViewHolder模式来解决性能和其他错误的项目问题。如何发送索引?在我添加whatsapp按钮之前,它是怎么工作的?你能帮我拿一下取景器吗?你需要学习如何研究。检查这些链接:和
final shawarma sh1 = getItem(position);