2017-11-06 9 views
1

나는 많은 시간이 이미 요청되었습니다. 하지만 많은 솔루션을 시도한 후에는 성공적으로 구현할 수 없습니다.목록 항목 업데이트를위한 ListView 어댑터 onClickListener

나는 여러 개의 View을 포함하는 맞춤 레이아웃 목록을 만들고 있습니다. 보기 중 하나는 ImageView이며 사용자가 클릭 할 때마다 아이콘이 변경되기를 원합니다. 다음과 같이 내가 사용

ListAdapter 클래스는 다음과 같습니다

public class PetitionListAdapter extends BaseAdapter { 

    ViewHolder holder = null; 

    private LayoutInflater inflater; 
    private ArrayList<CustomObject> objects; 

    private class ViewHolder { 
     ImageView ivsign; 
    } 

    public PetitionListAdapter(Context context, ArrayList<CustomObject> objects) { 
     inflater = LayoutInflater.from(context); 
     this.objects = objects; 
    } 

    public int getCount() { 
     return objects.size(); 
    } 

    public CustomObject getItem(int position) { 
     return objects.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.petition_list_layout_beta, null); 
      holder.ivsign = convertView.findViewById(R.id.ivsign); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.ivsign.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ImageView img = v.findViewById(R.id.ivsign); 
       img.setImageResource(R.drawable.icon_after_click); 
      } 
     }); 
     return convertView; 
    } 
} 

을 이렇게,에 ClickListener 작동하지만, 대신 특정 이미지 뷰, 그것은 임의의 행에 많은 imageviews의 아이콘을 변경합니다. 내가보기에 그것 때문에 알아 .Holder. 그러나 이것을 어떻게 올바르게 할 수 있습니까?

는 I 사용했다 : -

imgViewArray [위치] = holder.textView1;

"onListItemClickListener"내에 있습니다. 이 작업을 수행하면 원하는대로 해당 위치의 아이콘이 변경되지만 스크롤하고 다시 해당 행으로 돌아온 후에 기본 아이콘으로 다시 변경됩니다. 행이 재활용 될 수 있기 때문입니다.

+0

: 당신은 당신의 CustomObject에 뭔가를 항목의 위치를 ​​저장해야합니다. – codeFreak

답변

1

물론이 문제가 있습니다. 왜? 목록보기를 스크롤하면 모든 convert view이 다시 사용되고 각 convertViewCustomObject을 표시하는 데 사용되었습니다. 즉, 첫 행 이미지를 변경 한 경우 스크롤 한 후 first-row convertView을 재사용 한 행은 imageclicked row으로 표시됩니다. 그래서 어떻게 해결할 수 있을까요? 당신이 변화에 대한 어댑터 notify``다음 위치를 업데이트하는 코드에서 언급 한 바와 같이 데이터 세트에서 위치를 사용

public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.petition_list_layout_beta, null); 
     holder.ivsign = convertView.findViewById(R.id.ivsign); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    final CustomObject object = listCustomObject.get(position); 
    holder.ivsign.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((ImageView)v).setImageResource(R.drawable.icon_after_click); 
      object.saveResourceId(R.drawable.icon_after_click); // save your resource to use after scrolling. 
     } 
    }); 
    // display resouce base on what's saved or display default image. 
    holder.ivSign.setImageResource(object.getSavedResourceId()); 
    return convertView; 
} 
+0

그것은 일했다! 내가 제대로 한 경우 CustomObject 클래스를 확인하십시오. 'public class CustomObject { 사적인 int resId = R.drawable.ic_sign; public CustomObject() {} public String getProp9() { return prop9; } public void saveResourceId (int rid) {this.resId = rid; } public int getSavedResourceId() {return resId; } }' – Rishabh

0

귀하의 문제는 onClickListener에서 발생한다고 생각합니다. ViewHolderImageView으로 설정하고 onClick 방법으로 v.findViewById을 입력하십시오. 당신이 무엇을해야

ImageView img = (ImageView) convertView.findViewById(R.id.ivsign); 

그리고

img.setOnClickListener(.......); 

이 나를 위해 작동합니다, 그래서 당신이 구현 어떤 문제가있는 경우 알려 주시기입니다.

+0

여전히 문제가 동일합니다. 즉, 임의의 이미지보기 아이콘이 변경됩니다. – Rishabh

0

그건 좋지 않습니다. OnItemClick에서 목록에 사용 된 개체 목록을 변경 한 다음 notifyDataSetChanged()을 호출해야합니다. getView(...)에서 listView가 목록의 값을 반영하도록합니다. 이렇게하면 목록을 새로 고칠 때보기의 상태는 동일하게 유지됩니다.

+0

목록을 새로 고치지 않으면 첫 번째 행부터 시작하여 데이터가 다시 표시됩니까? 사실 나는 사용자가 imageView를 클릭 한 다음 스크롤을 계속할 때 아이콘 변경을 원합니다 (페이스 북에서 "좋아요"버튼을 클릭하는 것과 같습니다).그리고 대답이 "아니오"라면 분명히 그것을 사용할 것입니다. – Rishabh