2016-05-08 4 views
0

Я создал пользовательский ListView, расширив LinearLayout для каждой строки (Contact), и мне нужно выбрать элемент, но метод setOnItemClickListener() не работает. Я просто поставить onItemSelectedListener под и теперь метод "setOnItemClickListener" выберите всегда первый элемент, хотя я выбрать другую строкуsetOnItemClickListener() не работает в ListView (всегда выбирайте первую строку)

MainActivity:

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","[email protected]","1")); 
    listPhoneBook.add(new PhoneBook(BitmapFactory.decodeResource(getResources(),R.drawable.image),"Contact_2","123456789","[email protected]","2")); 
    listPhoneBook.add(new PhoneBook(BitmapFactory.decodeResource(getResources(),R.drawable.image),"Contact_3","123456789","[email protected]","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) { 

     } 
    }); 

} 

} 

PhoneBookAdapter:

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> 
+0

Вы можете попробовать это. http://stackoverflow.com/questions/1518338/setonitemclicklistener-not-working-on-custom-listview-android?rq=1 – Harsh4789

+0

Перемещение по мере того, как вы изменили свой вопрос, в то время как решение вашего исходного вопроса было опубликовано ниже. – agomes

+0

Теперь код работает. Я изменил все ваши андроиды: clickable = "true" для android: clickable = "false". Решение предлагает Harsh4789 –

ответ

0

Замените свой PhoneBook_row.xml тем, кого я здесь помещаю, я пробовал это, и это сработало для меня. Я изменил все ваши android:clickable="true" на android:clickable="false". Причина этого заключается в том, что все ваши дочерние представления потребляют клик, а результат - ваш родительский вид i.e ListView, не получающий событие click. Надеюсь это поможет.

<?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> 
+0

setOnItemClickListener() пока не работает –

+0

Я отредактировал ответ. Пожалуйста, попробуйте. Это сработает для вас. – Harsh4789

+0

Большое спасибо. Теперь функция «setOnItemClickListener()» работает –

0

Похоже, что вам не хватает переопределения. Добавить @Override перед функцией, как показано ниже.

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


      } 
     }); 

Также добавление андроида: clickable = true в файле макета не требуется.

+0

setOnItemClickListener() еще не работает –

+0

Вы изменили свой вопрос с оригинала. Однако, чтобы выбрать элемент, вы должны получить объект в этой позиции. – agomes

+0

Благодарим вас за поддержку. Я нашел решение, предлагаемое Harsh4789 –

0

Вы изменили свой вопрос, так или иначе, я верю, что теперь вы можете получить элемент, выбранный слушателем. Чтобы получить элемент, который выбран, вы можете использовать позицию ниже:

 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 
      } 
     }); 
Смежные вопросы