【问题标题】:setOnItemClickListener() not working on ListView (select always first row)setOnItemClickListener() 在 ListView 上不起作用(始终选择第一行)
【发布时间】:2016-05-11 17:20:05
【问题描述】:

我通过为每一行(联系人)扩展 LinearLayout 创建了一个自定义 ListView,我需要选择项目,但方法“setOnItemClickListener()”不起作用。我刚刚在下面放了一个 onItemSelectedListener,现在方法“setOnItemClickListener”总是选择第一个项目,尽管我选择了其他行

主活动:

public class MainActivity extends AppCompatActivity {

private ListView lvPhone;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lvPhone = (ListView)findViewById(R.id.listPhone);

    final List<PhoneBook> listPhoneBook = new ArrayList<PhoneBook>();
    listPhoneBook.add(new PhoneBook(BitmapFactory.decodeResource(getResources(),R.drawable.image),"Contact_1","123456789","av1@gmail.com","1"));
    listPhoneBook.add(new PhoneBook(BitmapFactory.decodeResource(getResources(),R.drawable.image),"Contact_2","123456789","av2@gmail.com","2"));
    listPhoneBook.add(new PhoneBook(BitmapFactory.decodeResource(getResources(),R.drawable.image),"Contact_3","123456789","av3@gmail.com","3"));

    final PhoneBookAdapter adapter = new PhoneBookAdapter(this, listPhoneBook);
    lvPhone.setAdapter(adapter);
    lvPhone.setItemsCanFocus(false);


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final Dialog d = new Dialog(MainActivity.this);
            d.setTitle("Login");
            d.setCancelable(true);
            d.setContentView(R.layout.account);
            d.show();

            Button button_close = (Button) d.findViewById(R.id.DCancel);
            button_close.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    d.dismiss();
                }
            });

            Button button_login = (Button) d.findViewById(R.id.DLogin);
            button_login.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    String mName = new String("Ciao");
                    String mPhone;
                    String mEmail;
                    String mID;
                    TextView TextName = (TextView) d.findViewById(R.id.DName);
                    TextView TextPhone = (TextView)d.findViewById(R.id.DPhone);
                    TextView TextEmail = (TextView)d.findViewById(R.id.DEmail);
                    TextView TextID = (TextView)d.findViewById(R.id.DID);
                    mName=TextName.getText().toString();
                    mPhone=TextPhone.getText().toString();
                    mEmail=TextEmail.getText().toString();
                    mID=TextID.getText().toString();
                    listPhoneBook.add(new PhoneBook(BitmapFactory.decodeResource(getResources(),R.drawable.image),mName,mPhone,mEmail,mID));
                    lvPhone.setAdapter(adapter);
                    d.dismiss();
                }
            });
        }
    });


    lvPhone.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            TextView TextName = (TextView) view.findViewById(R.id.tvName);
            TextView TextPhone = (TextView)view.findViewById(R.id.tvPhone);
            TextView TextEmail = (TextView)view.findViewById(R.id.tvEmail);
            TextView TextID = (TextView)view.findViewById(R.id.tvID);
            String tvName = new String(TextName.getText().toString());
            String tvPhone = new String(TextPhone.getText().toString());
            String tvEmail = new String(TextEmail.getText().toString());
            String tvID = new String(TextID.getText().toString());

            Toast.makeText(MainActivity.this, tvName, Toast.LENGTH_SHORT).show();
        }
    });

    lvPhone.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

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

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {

        }
    });

}

}

电话簿适配器:

public class PhoneBookAdapter extends BaseAdapter{

private Context mContext;
private List<PhoneBook> mListPhoneBook;

public PhoneBookAdapter (Context context, List<PhoneBook> list) {
    mContext = context;
    mListPhoneBook = list;
}
@Override
public int getCount() {
    return mListPhoneBook.size();
}
@Override
public Object getItem(int position) {
    return mListPhoneBook.get(position);
}
@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    PhoneBook entry = mListPhoneBook.get(position);

    if (convertView == null) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        convertView = inflater.inflate(R.layout.phonebook_row,null);
    }

    ImageView ivAvatar = (ImageView)convertView.findViewById(R.id.imgAvatar);
    ivAvatar.setImageBitmap(entry.getmAvatar());

    TextView tvName = (TextView)convertView.findViewById(R.id.tvName);
    tvName.setText(entry.getmName());

    TextView tvPhone = (TextView)convertView.findViewById(R.id.tvPhone);
    tvPhone.setText(entry.getmPhone());

    TextView tvEmail = (TextView)convertView.findViewById(R.id.tvEmail);
    tvEmail.setText(entry.getmEmail());

    TextView tvID = (TextView)convertView.findViewById(R.id.tvID);
    tvID.setText(entry.getmID());

    return convertView;
}

 }

`

PhoneBook_row:

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true">

<ImageView
    android:id="@+id/imgAvatar"
    android:layout_width="70dp"
    android:layout_height="70dp"
    android:scaleType="fitCenter"
    android:src="@drawable/image"
    android:clickable="true"/>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:clickable="true">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tvName"
        android:textStyle="bold"
        android:clickable="true"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tvPhone"
        android:textStyle="bold"
        android:clickable="true"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tvEmail"
        android:textStyle="bold"
        android:clickable="true"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tvID"
        android:textStyle="bold"
        android:clickable="true"/>

</LinearLayout>

</LinearLayout>

【问题讨论】:

  • 你可以试试这个。 stackoverflow.com/questions/1518338/…
  • 拒绝投票,因为您更改了问题,而原始问题的解决方案已在下面发布。
  • 现在代码可以工作了。我已将您所有的 android:clickable="true" 更改为 android:clickable="false"。 Harsh4789建议的解决方案

标签: android listview


【解决方案1】:

用我放在这里的那个替换你的PhoneBook_row.xml,我已经尝试过了,它对我有用。我已将您所有的android:clickable="true" 更改为android:clickable="false"。这样做的原因是,您所有的子视图都会消耗点击,结果是您的父视图,即ListView 没有收到点击事件。希望这会有所帮助。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="false">

    <ImageView
        android:id="@+id/imgAvatar"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:scaleType="fitCenter"
        android:src="@drawable/image"
        android:clickable="false"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:clickable="false">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tvName"
            android:textStyle="bold"
            android:clickable="false"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tvPhone"
            android:textStyle="bold"
            android:clickable="false"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tvEmail"
            android:textStyle="bold"
            android:clickable="false"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tvID"
            android:textStyle="bold"
            android:clickable="false"/>

    </LinearLayout>

</LinearLayout>

【讨论】:

  • 我已经编辑了答案。请试一试。它会为你工作。
  • 非常感谢。现在函数“setOnItemClickListener()”工作
【解决方案2】:

看起来您缺少覆盖。 在函数前添加@Override,如下所示。

   lvPhone.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


            }
        });

在布局文件中添加 android:clickable = true 也不是必须的。

【讨论】:

  • 您已将您的问题与原始问题不同。但是,要选择项目,您必须在该位置获取对象。
  • 感谢您的支持。我找到了 Harsh4789 建议的解决方案
【解决方案3】:

你已经改变了你的问题,无论如何我相信你现在可以让 item selected listener 工作。要获取选中的项目,您可以使用以下位置

     lvPhone.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                PhoneBook phoneBook = listPhoneBook.get(position);                 
                Toast.makeText(MainActivity.this, phoneBook.getName() , Toast.LENGTH_SHORT).show(); 
//where getName is a function to get the name in the phonebook class
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多