2015-02-01 3 views
0

У меня возникла проблема, когда я пытаюсь получить выбранную строку из списка, чтобы что-то сделать с помощью кнопки onClickListener.Android call onActivityResult при выборе списка

В принципе, у меня есть кнопка для каждой строки списка. Когда кнопка будет выбрана, она перейдет к намерению сканирования QR-кода. Когда результат возвращался в onActivityResult(), я хотел что-то сделать с этой строкой. Это, как я настроить кнопку слушателя:

public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 

      convertView = inflater.inflate(R.layout.attendee_listview_row, 
        null); 
      viewHolder = new ViewHolder(); 

      viewHolder.txt_dName = (TextView) convertView 
        .findViewById(R.id.txtDisplayName); 
          viewHolder.btn_scan = (ImageView) convertView.findViewById(R.id.btnScan); 

      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.txt_dName.setText(attendeeList.get(position) 
       .getAccountName().trim()); 

     viewHolder.btn_scan.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v){ 
       Intent intent = new Intent(
         "com.google.zxing.client.android.SCAN"); 
       intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); 
       startActivityForResult(intent, 0); 
      } 
     }); 

А вот onActivityResult():

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    if (requestCode == 0) { 
     if (resultCode == Activity.RESULT_OK) { 

      String contents = intent.getStringExtra("SCAN_RESULT"); 
      if(attendeeName.equals("Andrew") && contents.equals("QRCode1")){ 

      }else{ 
       Toast.makeText(context, "Event QR code does not match.", 
         Toast.LENGTH_LONG).show(); 
      } 

     } else if (resultCode == Activity.RESULT_CANCELED) { 
     } 
    } 
} 

Я уже сделал, если другое заявление внутри onActivityResult, но я не уверен, как получить выбранная строка ранее.

Любые руководства?

Заранее спасибо.

ОБНОВЛЕНИЕ

Вот вид LLIST элемент строки XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:descendantFocusability="blocksDescendants" 
android:orientation="horizontal" 
android:weightSum="1" > 

<LinearLayout 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.2" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/btnScan" 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:paddingRight="10dp" 
     android:paddingTop="15dp" 
     android:src="@drawable/qr_icon" /> 
</LinearLayout> 

<LinearLayout 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.5" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/txtDisplayName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="@color/lightred" 
     android:textSize="16dp" /> 
</LinearLayout> 

<LinearLayout 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.3" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/ivRegisteredTag" 
     android:layout_width="80dp" 
     android:layout_height="30dp" 
     android:paddingTop="15dp" 
     anddroid:visibility="gone" 
     android:src="@drawable/registered" /> 
</LinearLayout> 

</LinearLayout> 

Так в основном у меня есть зарегистрированное изображение для каждой строки. Затем внутри оператора if предположим, что условия согласованы, как мне нужно зарегистрированное изображение для этой строки?

ответ

0

Как долго вы занимаетесь? Если он не содержит слишком много элементов, вы можете использовать оператор switch в коде запроса. В вашей Adapter вы можете передать позицию как код запроса на startActivityForResult();:

public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 

      convertView = inflater.inflate(R.layout.attendee_listview_row, 
        null); 
      viewHolder = new ViewHolder(); 

      viewHolder.txt_dName = (TextView) convertView 
        .findViewById(R.id.txtDisplayName); 
          viewHolder.btn_scan = (ImageView) convertView.findViewById(R.id.btnScan); 

      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.txt_dName.setText(attendeeList.get(position) 
       .getAccountName().trim()); 

     viewHolder.btn_scan.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v){ 
       Intent intent = new Intent(
         "com.google.zxing.client.android.SCAN"); 
       intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); 
       startActivityForResult(intent, position); 
      } 
     }); 

и onActivityResult():

public void onActivityResult(final int requestCode, final int resultCode, final Intent intent) { 

    switch(requestCode){ 
     case 0: 
     // == first list item 
      if (resultCode == Activity.RESULT_OK) { 

       String contents = intent.getStringExtra("SCAN_RESULT"); 
       if(attendeeName.equals("Andrew") && contents.equals("QRCode1")){ 

       }else{ 
        Toast.makeText(context, "Event QR code does not match.", 
          Toast.LENGTH_LONG).show(); 
       } 

      } else if (resultCode == Activity.RESULT_CANCELED) { 
      } 
      break; 
     case 1: 
     // = second list item 
     . 
     . 
     . 
     default: 
      break; 
    } 

} 

Вид хак, но он должен работать.

+0

Не должно быть слишком долго, потому что в моем текущем наборе данных по-прежнему не так много данных. Не могли бы вы привести мне пример? – hyperfkcb

+0

Скажем, случай 0, и я хотел выделить фон строки. Я все еще могу это сделать? – hyperfkcb

+0

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

0

Для каждой строки списка вы устанавливаете тег. Вы должны установить в своих xml-кнопках, и когда вы определяете обработчики, вы можете взять теги в качестве объектов. Определите один объект TextView, где вы сохраните метку, используя getTag() от вида V.

TextView tv = v.getTag(); 

Извините за мой английский. В любом случае, этот URL-адрес может помочь вам What is the main purpose of setTag() getTag() methods of View?

+1

Извините, но я не понимаю.Не могли бы вы объяснить более подробное объяснение или предоставить мне пример кода? – hyperfkcb

+0

Этот пример помог мне узнать, как использовать атрибуты из каждого элемента списка [link] https://looksok.wordpress.com/tag/listview-item-with-button/ – Asier

Смежные вопросы