2014-10-12 4 views
0

위에서 볼 수 있듯이 저는 textviews가있는 목록보기와 버튼을 누르면 전화를 겁니다. 문제는 목록 항목 (항상 작동 함)을 선택한 후 버튼을 누르면 이상한 행동으로 연결된다는 것입니다. 때로는 효과가 있고 때로는 작동하지 않는 경우도 있습니다. 비슷한 주제를 읽었지만 해결책을 찾지 못했습니다. 어떤 도움을 주시면 감사하겠습니다.ListView 버튼이 항상 작동하지 않는 경우가 있습니다.

for (i = 0; i < final_itinList.size(); i++) { 
final_itinList.get(i).put("num", String.valueOf(i + 1)); 
String timi = final_itinList.get(i).get("diff"); 
final_itinList.get(i).put("diff", timi + "Km"); 
      } 

final ListAdapter adapter = new SimpleAdapter(
CheckItineraries.this, final_itinList, 
R.layout.list_item2, new String[] { "num", 
"startPoliPro", "finalPoliPro", "diff" }, 
new int[] { R.id.number_n, R.id.startpoli, 
      R.id.finalpoli, R.id.numKm }); 


list.setOnItemClickListener(new OnItemClickListener() { 


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

@SuppressWarnings("unchecked") 
HashMap<String, Object> obj = (HashMap<String, Object>) adapter.getItem(position-1); 
        final String phone_number = (String) obj.get("phone_number"); 


Button btnphone = (Button) findViewById(R.id.btnphone); 
    btnphone.setOnClickListener(new OnClickListener() { 

     @Override 
    public void onClick(View btnphone) { 

    try {            
      Intent intent = new Intent(
      Intent.ACTION_CALL); 
      intent.setData(Uri.parse("tel:"+phone_number)); 
           startActivity(intent); 
     } catch (Exception e) { 
     Log.e("Demo application", 
     "Failed to invoke call", e); 
     } 

답변

0

ListView을 사용하여 코드 스니 펫에서 올바르게 보이지 않는 몇 가지 사항이 있습니다. 안드로이드에 ListView을 올바르게 사용하려면 Google I/O presentation을 조사하는 것이 좋습니다.

ListView 행 항목 onClick 이벤트에 단추 작업 이벤트를 바인딩하려는 코드 조각의 문제점 - 완전히 잘못되었습니다! getView 어댑터 메소드를 재정의하고 제공된 데이터 세트로 각 행 항목에 대한 하위 뷰를 확장해야합니다. 예를 들어

:

public class CustomAdapter extends SimpleAdapter { 

    private Context context; 
    private int layoutResId; 

    public CustomAdapter(Context context, List<? extends Map<String, ?>> data, 
        int resource, String[] from, int[] to) { 

     super (context, data, resource, from, to); 

     // hold the items 
     this.context = context; 
     this.layoutResId = resource; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolderItem viewHolder; 
     if (converView == null) { 

      // inflate the layout 
      LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
      convertView = inflater.inflate(layoutResId, parent, false); 

      // well set up the ViewHolder 
      viewHolder = new ViewHolderItem(); 
      viewHolder.phoneBtn = (Button)view.findById(R.id.btnphone); 

      // store the holder with the view. 
      convertView.setTag(viewHolder);  
     } 
     else { 
      // we've just avoided calling findViewById() on resource everytime 
      // just use the viewHolder 
      viewHolder = (ViewHolderItem) convertView.getTag(); 
     } 

     // Don't know the purpose of position-1 here. 
     HashMap<String, Object> data = (HashMap<String, Object>) getItem(position-1); 
     if (data != null) { 

      String phone_number = (String)data.get("phone_number"); 

      // set button action 
      viewHolder.phoneBtn.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View view) { 
        try { 
        Intent intent = new Intent(Intent.ACTION_CALL); 
        intent.setData(Uri.parse("tel:" + phone_number)); 
        startActivity(intent); 
        } catch (Exception e) { 
        Log.e("Demo application", "Failed to invoke call", e); 
        } 
       } 
      } 
     } 
    } 

    /** 
    * Hold View items 
    */ 
    static class ViewHolderItem { 

     private Button phoneBtn; 
    } 
} 

지금 당신이 CustomAdapter의 개체를 만들고있는 ListView에 할당 할 수 있습니다.

CustomAdapter adapter = new CustomAdapter(
            CheckItineraries.this, 
            final_itinList, 
            R.layout.list_item2, 
            new String[] { "num", "startPoliPro", "finalPoliPro", "diff" }, 
            new int[] { R.id.number_n, R.id.startpoli, R.id.finalpoli, R.id.numKm }); 

// set the adapter 
list.setAdapter(adapter); 

: 이전에 정의 된 ViewHolderItem는 모양 업 findViewById()을 줄이고 부드러운 스크롤의 성능을 향상 안드로이드 디자인 패턴입니다. 자세한 내용은 here을 참조하십시오.

+0

깊이 분석을 해주셔서 감사합니다. –

0

목록 리스너 내에 버튼 수신기를 설정하고 있습니다.

즉, 목록 항목을 클릭하면 버튼 클릭 수신기가 설정됩니다. 그런 다음에만 해당 특정 단추를 클릭하여 호출을 호출 할 수 있습니다. 당신이해야 할 무엇


버튼 리스너 목록 항목이 팽창되면 (생성)를 설정하는 사용자 정의 어댑터를 만드는 것입니다.

for (i = 0; i < final_itinList.size(); i++) { 
    final_itinList.get(i).put("num", String.valueOf(i + 1)); 
    String timi = final_itinList.get(i).get("diff"); 
    final_itinList.get(i).put("diff", timi + "Km"); 
} 

final ListAdapter adapter = new SimpleAdapter(
     CheckItineraries.this, final_itinList, 
     R.layout.list_item2, new String[] { "num", 
     "startPoliPro", "finalPoliPro", "diff" }, 
     new int[] { R.id.number_n, R.id.startpoli, 
       R.id.finalpoli, R.id.numKm }) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 

     // Fetch the phone number (dunno why you have position-1...) 
     HashMap<String, Object> obj = (HashMap<String, Object>) getItem(position-1); 
     final String phone_number = (String) obj.get("phone_number"); 
     Log.d("phone", phone_number); 

     // Set the button click listener 
     Button btnphone = (Button) view.findViewById(R.id.btnphone); 
     btnphone.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View btnphone) { 
       try { 
        Intent intent = new Intent(Intent.ACTION_CALL); 
        intent.setData(Uri.parse("tel:" + phone_number)); 
        startActivity(intent); 
       } catch (Exception e) { 
        Log.e("Demo application", "Failed to invoke call", e); 
       } 
      } 
     }); 

     return view; 
    } 
}; 

참고 : 예를 들면 다음과 같습니다의 재 설정 버튼 리스너가 비효율적이다의이 방법은, 그럼에도 불구하고 그것은 (한 다른 코드가 작동하기 때문에) 작동합니다. 다른 문제가 발생하면 다른 질문을해야합니다.

+0

"로컬 변수 어댑터가 초기화되지 않았을 수 있습니다. –

+0

@ FeniaKechagia가 업데이트되었으므로 여기에서 '어댑터'만 제거하면됩니다. – Simas

관련 문제