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);