【问题标题】:list view click gets the wrong item列表视图单击获取错误的项目
【发布时间】:2016-11-13 08:22:54
【问题描述】:

我有一个从我的适配器膨胀的列表视图。 当我单击其中一个按钮时,我得到了错误的项目。 在我添加了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;
}

在代码中添加了一个 onClickListener,如果按下 waze 按钮,它应该检查位置,或者如果按下 whatsapp 按钮,则检查名称。 这是代码

class listener implements View.OnClickListener{

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

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

                try
                {
                    String url = "waze://?ll="+lat+","+lon+"&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 "+nname+"?");
                sendIntent.setType("text/plain");

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

                break;


        }
    }
}

如何更改此设置以获得正确的项目?

【问题讨论】:

  • 您没有将项目的索引发送给您的听众。听众如何知道您点击了哪个索引?此外,您还需要在适配器上使用 ViewHolder 模式来解决性能和其他错误项目问题。
  • 如何发送索引?在我添加whatsapp按钮之前它是如何工作的?你能帮忙处理一下viewholder吗?

标签: android listview adapter


【解决方案1】:

你可以试试这个方法

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

}

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      而不是,

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 2021-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多