2014-10-10 2 views
0

솔루션을 검색 한 결과 해결책을 찾지 못했습니다.ListView onItemClick이 사용자 지정 어댑터와 작동하지 않습니다.

각 항목에 TextView와 HorizontalScrollView가있는 ListView를 사용하고 있습니다. HorizontalScrollView는 런타임에 몇 가지 TextViews로 채워집니다. 사용자가이 TextView 중 하나를 클릭하면 뷰의 배경이 토글되며 TextView 클래스가 확장됩니다.

문제는 ListView onItemClick이 실행되지 않는다는 것입니다. 나는 약간의 코드로 놀았고, 이유를 들어 이해할 수없는 경우 클릭 이벤트가 발생하지만 가끔씩 각 목록 항목 사이를 클릭 할 때만 발생합니다. 내 TextView가 클릭 이벤트를 처리하거나 레이아웃 중 하나가 이벤트를 방해하고 있기 때문에 그 중 하나라고 생각합니다.

편집 :

난 할 노력하고있어 것은 :

텍스트 뷰를 클릭 할 때
  1. , 그것은 몇 가지 시각 효과를 전환.

  2. 데이터 구조에 값 (텍스트)을 추가하십시오.

사용자 정의 TextView는 클릭 이벤트를 잘 처리하지만 어댑터에서 해당 클릭 이벤트를 가져올 수 없습니다. ListView에서 위치를 알아야하기 때문에 필요합니다.

public class KeywordListAdapter extends ArrayAdapter<String> implements OnClickListener { 

    private final Context context; 
    private final String[] values; 
    private AspectManager aspectManager; 

    static class ViewHolder { 
      protected TextView aspectName; 
      protected HorizontalScrollView horizContainer; 
      protected LinearLayout keyWrapper; 
      protected KeywordTextView[] keyword; 
    } 

    public KeywordListAdapter(Context context, String[] values) { 
      super(context, R.layout.aspect_list_answer, values); 
      this.context = context; 
      this.values = values; 
      aspectManager = AspectManager.getInstance(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
      Aspect aspect = aspectManager.getAspectByName(values[position]); 
      View row = convertView; 

      // reuse views 
     if (row == null) { 
      Log.w(Constants.TAG, "row == null"); 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.aspect_list_answer, parent, false); 

        ViewHolder viewHolder = new ViewHolder(); 

        viewHolder.horizContainer = (HorizontalScrollView) row.findViewById(R.id.horizontalRow); 
        viewHolder.horizContainer.setHorizontalScrollBarEnabled(false); 

        viewHolder.keyWrapper = new LinearLayout(context); 
        viewHolder.keyWrapper.setOrientation(LinearLayout.HORIZONTAL); 
        viewHolder.keyWrapper.setId(0); 

        viewHolder.keyword = new KeywordTextView[aspect.getKeywordCount()]; 
        viewHolder.aspectName = (TextView) row.findViewById(R.id.lblAspect); 

        String[] keywords = aspect.getAspectKeys(); 
        for (int i=0; i< keywords.length; i++){ 
          viewHolder.keyword[i] = new KeywordTextView(context); 
          viewHolder.keyword[i].setOnClickListener(this); 
          viewHolder.keyWrapper.addView(viewHolder.keyword[i]); 
        } 

        viewHolder.horizContainer.addView(viewHolder.keyWrapper); 
        row.setTag(viewHolder); 
     } 

     //Set values 
     ViewHolder holder = (ViewHolder) row.getTag(); 

      //Fill aspect name 
      holder.aspectName.setText(aspect.getAspectName()); 
      holder.aspectName.setTextColor(Color.WHITE); 

      //Fill keywords 
      String[] keywords = aspect.getAspectKeys(); 
      for (int i=0; i< keywords.length; i++){ 
        holder.keyword[i].setKeyword(keywords[i]); 
        holder.keyword[i].setColor(baseColor); 

      //set keyword layout 
        LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
        llp.gravity = Gravity.CENTER_VERTICAL; 
        llp.setMargins(20, 15, 20, 20); 
        holder.keyword[i].setLayoutParams(llp); 
      } 

      return row; 
    } 

    @Override 
    public void onClick(View v) { 
      ((KeywordTextView)v).toggle(); 
    } 

    public class KeywordTextView extends TextView { 
      String keyword; 
      String color; 
      boolean selected; 
      private GradientDrawable gd; 

     public KeywordTextView(Context context) { 
      super(context); 
      gd = new GradientDrawable(); 
      selected = false; 
     } 

     public void setKeyword(String keyword){ 
      this.keyword = keyword; 
      setText(keyword); 
     } 

     public String getKeyword(){ 
      return keyword; 
     } 

     public void setColor(String color){ 
      this.color = color; 
      setText(keyword); 
     } 

     public boolean isKeywordSelected(){ 
      return this.selected; 
     } 

     protected void onDraw (Canvas canvas) { 
      super.onDraw(canvas); 

      //Set style 
      ... 
     } 

     protected void toggle(){ 
      selected = !selected; 
     } 
    } 

} 활동의

와 관계있는 부분 :리스트 뷰의 내부 전경 상에 OnClickListener를 설정했기 때문에 당신이 발생하는 문제가

... 
aspectList = (ListView)findViewById(R.id.lvAspectList); 
aspectList.setAdapter(new KeywordListAdapter(this, aspects.split(", "))); 
aspectList.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
      Log.w(TAG, "aspectList onItemClick"); 
     } 
}); 
... 
+0

List 항목에 포커스를 가져 오는 onClick 수신기가 있기 때문에 정상적으로 작동한다고 생각합니다. 그래도 틀릴 수 있습니다. – zgc7009

+0

은 aspect_list_answer.xml 코드를 표시합니다. –

답변

0

은, 무슨 일이 여기 일이다 이것은 listviews에 대한 기본 OnClickListener를 재정의합니다. 최선의 방법은 이것을 사용하는 것입니다.

row.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
     //Enter Your Code Here 
     } 

    }); 
+0

자식 TextView를 클릭하면 작동하지 않습니다. 내 편집을 참조하십시오. – user3339411

+0

흠, 올바르게 이해했다면, 방금 ListView를 클릭하고 그걸로 뭔가를 할 TextView 텍스트를 잡으려고하고 있습니까? 더 자세히 설명 할 수 있다면 잘하면 당신을 도울 수 있습니다. – Rhynoboy2009

+0

아이디어는 각 주제 (topic = row/horizontal view)에서 키워드를 선택한다는 것입니다. 각 선택에 대해 선택 효과를 수행하고 키워드를 나중에 서버로 전송할 키워드 목록에 추가해야합니다. 그래서 키워드 (TextView)와 클릭 한 행을 알아야합니다. – user3339411

관련 문제