2016-11-10 1 views
0

이상하게 들리지만 코드를 사용하여 하나의 행을 길게 누르면 해당 행의 별이 금색으로 바뀝니다.RecyclerView - 하나의 선택으로 10 개의 행이 선택됩니다.

public class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView localeDisplay; 
    private static final int grey_blue = 0xff546E7A; 
    private static final int gold = 0xffffa000; 

    public MyViewHolder(final View view) { 
     super(view); 
     localeDisplay = (TextView) view.findViewById(R.id.languageText); 

     view.setOnClickListener(new View.OnClickListener() { 

            @Override 
            public void onClick(View view) { 
             Languages currentLanguages = languagesList.get(getAdapterPosition()); 
             Snackbar snackbar; 
             snackbar = Snackbar.make(view, currentLanguages.getLocaleDisplay() + " selected", Snackbar.LENGTH_INDEFINITE) 
               .setAction("Next", new View.OnClickListener() { 
                @Override 
                public void onClick(View v) { 
                 Intent intent = new Intent(v.getContext(), MainActivity.class); 
                 v.getContext().startActivity(intent); 
                } 
               }); 
             View snackBarView = snackbar.getView(); 
             snackBarView.setBackgroundColor(grey_blue); 
             snackbar.show(); 
            } 
           } 

     ); 

     view.setOnLongClickListener(new View.OnLongClickListener() 

            { 
             @Override 
             public boolean onLongClick(View v) { 
              Toast.makeText(v.getContext(), "Position is " + getAdapterPosition(), Toast.LENGTH_SHORT).show(); 

              ImageView star = (ImageView) view.findViewById(R.id.imageView); 

              if (star.getColorFilter() == null) { 
               star.setColorFilter(gold); 
              } else star.clearColorFilter(); 

              return true; 
             } 
            } 

     ); 
    } 

내가 this tutorial가 있지만 같은 동작이 발생 다음 시도 : 이 내 코드입니다. 이 문제를 해결하기 위해 내가 할 수있는 아이디어가 있습니까?

+0

뷰가 재생 중입니다. 즉, 뷰가 재생성되는 대신 재사용됨을 의미합니다. 별을 하나로 설정하면 재사용 할 때 시작이 계속 설정됩니다. 각 항목에 별표가 있어야하는지 여부를 결정하기 위해 플래그를 개별적으로 필요로합니다. '설정'은 금을 돌리는 것을 의미합니다. – zgc7009

+0

답장을 보내 주셔서 감사합니다. 그러나 동적으로 변경되는 목록에 대해서는 가능한가요? 그렇다면, 나는 그것을 어떻게하는지 알아 내려고 노력할 것입니다. –

+0

클릭 한대로 목록의 각 특정 항목에 플래그를 지정하는 방법이 필요합니다. 예를 들어 목록에 항목 9를 설정 한 경우 항목 9가 클릭되었다는 내용이 필요합니다. 이것에 접근하는 방법은 매우 많습니다. 어댑터는 단지 당신이하고 싶은 것을 위해 사용할 수있는 뷰임을 인식합니다. 보기의 현재 상태가 무엇인지는 상관하지 않습니다. – zgc7009

답변

0

보기가 재활용되고있는 것처럼 보입니다. 이는 재생 된 모든보기에 대해 청취자 참조가 호출되고 있음을 의미합니다.

이 문제를 쉽게 해결할 수있는 방법은 onBindViewHolder 메서드에서 각 단일보기에 대한 새 참조를 설정하는 것입니다. 일반적으로 Viewholder는 뷰를 찾고 재활용 뷰에 대한 참조를 유지하는 데 사용됩니다. 내부에 데이터를 설정하는 것은 좋지 않습니다. onBindViewHolder에서 리스너를

public ExampleViewHolder(View view) { 
     super(view); 
     myContainer = (LinearLayout) view.findViewById(R.id.myContainer); 
     localeDisplay = (TextView) view.findViewById(R.id.languageText); 
     star = (ImageView) view.findViewById(R.id.imageView); 
    } 

그리고 설정 :

는 당신의 viewholder을 바꿀 수

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 

    ExampleHolder holder = (ExampleHolder) viewHolder; 

    //Insert the position reference 
    holder.myContainer.setTag(position); 

    // Setting listeners 
    holder.myContainer.setOnClickListener(this); 
    holder.myContainer.setOnLongClickListener(this); 

} 

그런 다음 어댑터에서 OnLongClickListener와 OnClickListener를 구현합니다.

@Override 
public boolean onLongClick(View v) { 

    //Getting position 
    int position = (int)v.getTag(); 

    //Insert your code 
    return false; 
} 

@Override 
public void onClick(View v) { 
    //code here 
} 

작동하는 경우 회신을받습니다. 행운을 빕니다.

+0

대단히 감사합니다! 나는 일하기 위해 조금 고생하고 있지만 곧 다시 시도 할 것입니다. :) –

+0

문제는 View myView = view.findViewById (R.id.recycler_view)입니다. 하지만 "보기"는 해결할 수 없습니다. 나는 무엇을해야할지 모르겠습니다. –

+0

대신 레이아웃 컨테이너를 참조하십시오. 예 : LinearLayout myContainer = (LinearLayout) view.findViewById (R.id.myContainer);) 리스너 참조를 myContainer로 설정하는 것을 잊지 마십시오. –

0

R.id.imageView ID를 가진 모든 항목을 가져 오기 때문입니다. 원하는 것을하기 위해서 클릭 한 항목을 잡고 선택한 줄의 색만 변경해야합니다.

+0

고마워요.하지만 이것이 사실이라고 생각하지 않습니다. ;-) –

관련 문제