2015-06-30 28 views
0

我使用列表視圖用鼠標適配器排列表視圖,每個列表視圖排了一次用戶點擊其中任何一項,我突出了綠色的顏色,如果正確的選項四個可單擊選項用戶選擇了錯誤的選項然後選擇一種紅色。填充先前選擇的選項,同時重用

現在,當我滾動它突出了一行用綠色和紅色,即使我沒有選擇這些選項的列表視圖。

我知道這個問題是,當列表視圖重用行,然後它正在發生,但如何避免它們,任何機構可以請建議我。下面

參考

public class RoundsListAdapter extends CursorAdapter { 


    private String mOptionOne = "option_1"; 
    private String mOptionTwo = "option_2"; 
    private String mOptionThree = "option_3"; 
    private String mOptionFour = "option_4"; 

    private LayoutInflater mLayoutInflator; 
    private Context mContext; 


    public RoundsListAdapter(Context context, Cursor c, boolean autoQuery,int windowHeight, int windowWidth) { 
     super(context, c,autoQuery); 
     mLayoutInflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     final View customView = mLayoutInflator.inflate(R.layout.talk_row_list,null); 
     return customView; 
    } 

    @Override 
    public void bindView(View view, Context context, final Cursor cursor) { 

     final CustomButtonFlat option_1 = (CustomButtonFlat)view.findViewById(R.id.talks_answerA); 
     View option_1SepartorView = view.findViewById(R.id.talks_answerA_seprator); 
     final CustomButtonFlat option_2 = (CustomButtonFlat)view.findViewById(R.id.talks_answerB); 
     View option_2SepartorView = view.findViewById(R.id.talks_answerB_seprator); 
     final CustomButtonFlat option_3 = (CustomButtonFlat)view.findViewById(R.id.talks_answerC); 
     View option_3SepartorView = view.findViewById(R.id.talks_answerC_seprator); 
     final CustomButtonFlat option_4 = (CustomButtonFlat)view.findViewById(R.id.talks_answerD); 
     final ImageView talksThankImage = (ImageView)view.findViewById(R.id.talks_thank_image); 
     final TextView talksNoOfThanks = (TextView)view.findViewById(R.id.talks_no_of_thanks); 


     String optionA = cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_1)); 
     String optionB = cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_2)); 
     String optionC = cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_3)); 
     String optionD = cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_4)); 
     if(optionA == null || optionA.length()<=0){ 
      option_1.setVisibility(View.GONE); 
      option_1SepartorView.setVisibility(View.GONE); 
     }else{ 
      option_1.setVisibility(View.VISIBLE); 
      option_1SepartorView.setVisibility(View.VISIBLE); 
      option_1.setText(cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_1))); 
     } 

     if(optionB == null || optionB.length()<=0){ 
      option_2.setVisibility(View.GONE); 
      option_2SepartorView.setVisibility(View.GONE); 
     }else{ 
      option_2.setVisibility(View.VISIBLE); 
      option_2SepartorView.setVisibility(View.VISIBLE); 
      option_2.setText(cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_1))); 
     } 

     if(optionC == null || optionC.length()<=0){ 
      option_3.setVisibility(View.GONE); 
      option_3SepartorView.setVisibility(View.GONE); 
     }else{ 
      option_3.setVisibility(View.VISIBLE); 
      option_3SepartorView.setVisibility(View.VISIBLE); 
      option_3.setText(cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_1))); 
     } 

     if(optionD == null || optionD.length()<=0){ 
      option_4.setVisibility(View.GONE); 
     }else{ 
      option_4.setVisibility(View.VISIBLE); 
      option_4.setText(cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_1))); 
     } 

     // only set these listeners if MCQ in the talks are available 
     final String mcqAnswer = cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_ANSWER)); 
     Log.d(TAG," Talk mcq answer is = " + mcqAnswer); 


     option_1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(mcqAnswer.equalsIgnoreCase(mOptionOne)){ 
        option_1.setBackgroundResource(R.color.correctMCQAnswer); 


       }else if(mcqAnswer.equalsIgnoreCase(mOptionTwo)){ 
        option_1.setBackgroundColor(Color.RED); // settings wrong color 
        option_2.setBackgroundResource(R.color.correctMCQAnswer); 
        // setting correct color for correct answer 
        Log.d(TAG, " Setting button color answer 2"); 

       }else if(mcqAnswer.equalsIgnoreCase(mOptionThree)){ 
        option_1.setBackgroundColor(Color.RED); // settings wrong color 
        option_3.setBackgroundResource(R.color.correctMCQAnswer); 
        Log.d(TAG, " Setting button color answer 3"); 

       }else if(mcqAnswer.equalsIgnoreCase(mOptionFour)){ 
        option_1.setBackgroundColor(Color.RED); // settings wrong color 
        option_4.setBackgroundResource(R.color.correctMCQAnswer); 
        Log.d(TAG, " Setting button color answer 4"); 
       } 

      } 
     }); 

     option_2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mcqAnswer.equalsIgnoreCase(mOptionOne)) { 
        option_2.setBackgroundColor(Color.RED); 
        option_1.setBackgroundResource(R.color.correctMCQAnswer); 

       } else if (mcqAnswer.equalsIgnoreCase(mOptionTwo)) { 
        option_2.setBackgroundResource(R.color.correctMCQAnswer); 

       } else if (mcqAnswer.equalsIgnoreCase(mOptionThree)) { 
        option_2.setBackgroundColor(Color.RED); // settings wrong color 
        option_3.setBackgroundResource(R.color.correctMCQAnswer); 

       } else if (mcqAnswer.equalsIgnoreCase(mOptionFour)) { 
        option_2.setBackgroundColor(Color.RED); // settings wrong color 
        option_4.setBackgroundResource(R.color.correctMCQAnswer); 
       } 
      } 
     }); 

     option_3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mcqAnswer.equalsIgnoreCase(mOptionOne)) { 
        option_3.setBackgroundColor(Color.RED); 
        option_1.setBackgroundResource(R.color.correctMCQAnswer); 

       } else if (mcqAnswer.equalsIgnoreCase(mOptionTwo)) { 
        option_3.setBackgroundColor(Color.RED); // settings wrong color 
        option_2.setBackgroundResource(R.color.correctMCQAnswer); 

       } else if (mcqAnswer.equalsIgnoreCase(mOptionThree)) { 
        option_3.setBackgroundResource(R.color.correctMCQAnswer); 

       } else if (mcqAnswer.equalsIgnoreCase(mOptionFour)) { 
        option_3.setBackgroundColor(Color.RED); // settings wrong color 
        option_4.setBackgroundResource(R.color.correctMCQAnswer); 
       } 
      } 
     }); 

     option_4.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mcqAnswer.equalsIgnoreCase(mOptionOne)) { 
        //mQuestion_1.setBackgroundColor(Color.GREEN); // setting correct color 
        option_4.setBackgroundColor(Color.RED); 
        option_1.setBackgroundResource(R.color.correctMCQAnswer); 

       } else if (mcqAnswer.equalsIgnoreCase(mOptionTwo)) { 
        option_4.setBackgroundColor(Color.RED); // settings wrong color 
        option_2.setBackgroundResource(R.color.correctMCQAnswer); 

       } else if (mcqAnswer.equalsIgnoreCase(mOptionThree)) { 
        option_4.setBackgroundColor(Color.RED); // settings wrong color 
        option_3.setBackgroundResource(R.color.correctMCQAnswer); 

       } else if (mcqAnswer.equalsIgnoreCase(mOptionFour)) { 
        option_4.setBackgroundResource(R.color.correctMCQAnswer); 
       } 
      } 
     }); 



    } 






} 
+1

您必須在每次使用前初始化您的視圖。否則,您會將視圖置於以前的使用狀態。在'bindView'中,您應該:清除所有元素的背景,如果用戶已經選擇了答案(爲了保留用戶選擇),請設置背景。 – MyDogTom

+0

請你可以幫我通過代碼,你是建議很好的東西。 – Naga

+0

我添加了一個示例代碼。看一看。 – MyDogTom

回答

0

當一個項目被選中,你應該將其保存到數據庫的代碼。每行的狀態中,無論被選中還是不應該由BindView取決於來自分貝

+0

不錯的主意,你可以建議的任何其他方式 – Naga

+0

其實它只是用於沒有任何記錄的播放,所以這就是爲什麼我沒有將這些保存到數據庫中 – Naga

+0

只是在適配器內創建一個數組來保存您選擇的答案。根據該數組設置項目。 –

0

示例代碼數據集。此代碼是指示,它不會編譯,但應顯示您的想法。想法是:

您必須在每次使用前初始化您的視圖。否則,您將在以前使用狀態下查看該視圖。在bindView中你應該這樣做: 清除所有元素的背景,如果用戶已經選擇了 (爲了你需要保留用戶選擇),設置背景。

示例代碼。我刪除了部分代碼以縮短代碼長度。

public class RoundsListAdapter extends CursorAdapter { 


    private String mOptionOne = "option_1"; 
    private String mOptionTwo = "option_2"; 
    private String mOptionThree = "option_3"; 
    private String mOptionFour = "option_4"; 

    private LayoutInflater mLayoutInflator; 
    private Context mContext; 
    private String[] mAnswers; 


    public RoundsListAdapter(Context context, Cursor c, boolean autoQuery,int windowHeight, int windowWidth) { 
     super(context, c,autoQuery); 
     mLayoutInflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     //init array with answer. need to do the same or similar in swapCursor 
     mAnswers = new String[c.getCount()]; 

    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     final View customView = mLayoutInflator.inflate(R.layout.talk_row_list,null); 
     return customView; 
    } 

    @Override 
    public void bindView(View view, Context context, final Cursor cursor) { 

     final CustomButtonFlat option_1 = (CustomButtonFlat)view.findViewById(R.id.talks_answerA); 
     ... 

     //Define current position 
     final currentPosition = cursor.getPosition(); 

     String optionA = cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_1)); 
     ... 

     //reset background color and background resources 
     option_1.setBackgroundColor(DEFAULT_COLOR_HERE); 
     option_1.setBackgroundResource(DEFAULT_RESOURCE_HERE_OR_ZERO) 
     ... 
     //same for other "option_X" 
     option_4.setBackgroundColor(DEFAULT_COLOR_HERE); 
     option_4.setBackgroundResource(DEFAULT_RESOURCE_HERE_OR_ZERO) 

     if(optionA == null || optionA.length()<=0){ 
      option_1.setVisibility(View.GONE); 
      option_1SepartorView.setVisibility(View.GONE); 
     }else{ 
      option_1.setVisibility(View.VISIBLE); 
      option_1SepartorView.setVisibility(View.VISIBLE); 
      option_1.setText(cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_OPTION_1))); 
     } 

     ... 

     // only set these listeners if MCQ in the talks are available 
     final String mcqAnswer = cursor.getString(cursor.getColumnIndexOrThrow(TalkTable.TALK_ANSWER)); 
     Log.d(TAG," Talk mcq answer is = " + mcqAnswer); 


     //init color and background for already answered questions 
     if (mcqAnswer.equals(mOptionOne){ 
      if (mcqAnswer.equals(mAnswers[currenPosition])){ 
       option_1.setBackgroundResource(R.color.correctMCQAnswer); 
      } else { 
       option_1.setBackgroundColor(Color.RED); // settings wrong color 
        option_2.setBackgroundResource(R.color.correctMCQAnswer); 
      } 
     } if (mcqAnswer.equals(mOptionTwo)){ 
      //the same but for optionTwo 
     } 
     ... 
     //add same conditions for each option 


     option_1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       //save choice. For others it will be mOptionTwo, mOptionThree, mOptionFour 
       mAnswers[currenPosition] = mOptionOne; 

       if(mcqAnswer.equalsIgnoreCase(mOptionOne)){ 
        option_1.setBackgroundResource(R.color.correctMCQAnswer); 


       }else if(mcqAnswer.equalsIgnoreCase(mOptionTwo)){ 
        option_1.setBackgroundColor(Color.RED); // settings wrong color 
        option_2.setBackgroundResource(R.color.correctMCQAnswer); 
        // setting correct color for correct answer 
        Log.d(TAG, " Setting button color answer 2"); 

       }else 
       ... 
      } 
     }); 

     ... 
     //Other listeners 



    } 
} 
+0

好的,謝謝,會嘗試更新你 – Naga