2016-11-24 54 views
0

我想更新RecylerView的特定位置的視圖,但它不會發生,由於一些問題如下 - 1)當向上/向下滾動它創建混亂 2)我通過holder.setIsRecyclable(false);來處理這個問題,但是當向上/向下滾動時,它再次不顯示先前保存的子狀態。更新回收查看活動的startOnActivityResult特定位置

我的代碼如下 -

適配器類

public class EventNameAdapter extends RecyclerView.Adapter<EventNameAdapter.MyViewHolder> { 

private List<EventNameModel> eventNameList; 

public class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView eventNameText; 
    public ImageView imageViewRadio; 

    public MyViewHolder(View view) { 
     super(view); 
     eventNameText = (TextView) view.findViewById(R.id.eventNameText); 
     imageViewRadio = (ImageView) view.findViewById(R.id.imageViewRadio); 
    } 
} 


public EventNameAdapter(List<EventNameModel> eventNameList) { 
    this.eventNameList = eventNameList; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.event_name, parent, false); 

    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    EventNameModel movie = eventNameList.get(position); 
    holder.setIsRecyclable(false); 
    holder.eventNameText.setText(movie.getEventName()); 
} 

@Override 
public int getItemCount() { 
    return eventNameList.size(); 
} 

}

UPDATE位置代碼

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 101) { 
     if(resultCode == RESULT_OK){ 
      int responseInt = data.getIntExtra("SUBMIT_DATA",-2); 
      Toast.makeText(EventListActivity.this,"Response- "+responseInt,Toast.LENGTH_SHORT).show(); 
      if(responseInt>=0){ 
        EventNameAdapter.MyViewHolder viewHolder = (EventNameAdapter.MyViewHolder) nameRecyclerView.findViewHolderForAdapterPosition(responseInt); 
        if (viewHolder != null) { 
          Toast.makeText(EventListActivity.this,"Response 2 - "+responseInt,Toast.LENGTH_SHORT).show(); 
          viewHolder.imageViewRadio.setImageResource(R.drawable.radio_button_on); 
          Log.d("hellotom", "if i=" + responseInt); 

        } else { 
         Log.d("hellotom", "else i=" + responseInt); 
        } 
      } 
     } 
    } 
} 

請幫助我,我將如何解決這個問題。

+1

如何通過recyclerview適配器更新,而不是直接編輯viewholder自己呢? –

+0

我想只更新特定位置的孩子,但它取決於以前活動的回答 –

回答

3

在你EventNameModel類中,有一個字段,以維護您的單選按鈕的狀態就像下面

public class EventNameModel { 
    // your other fields 
    private boolean isRadioOn; 

    public void setIsRadioOn(boolean value){ 
     this.isRadioOn = value; 
    } 

    public boolean isRadioOn(){ 
     return isRadioOn; 
    } 
} 

然後像如下

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    EventNameModel movie = eventNameList.get(position); 
    holder.eventNameText.setText(movie.getEventName()); 
    if(movie.isRadioOn()){ 
     holder.imageViewRadio.setImageResource(R.drawable.radio_button_on); 
    } else { 
     holder.imageViewRadio.setImageResource(R.drawable.radio_button_off); 
    } 
} 

有在這樣的方法調整你onBindViewHolder方法您的適配器類更新從其他活動檢索到的位置

public void updateItemAt(int position){ 
    EventNameModel movie = eventNameList.get(position); 
    movie.setIsRadioOn(true); 
    notifyItemChanged(position); 
} 

現在你可以調用這個方法從onActivityResult喜歡如下

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 101) { 
     if(resultCode == RESULT_OK){ 
      int responseInt = data.getIntExtra("SUBMIT_DATA",-2); 
      if(responseInt>=0){ 
       mAdapter.updateItemAt(responseInt); 
      } 
     } 
    } 
} 
+0

+1爲您的答案。很好的概念..非常感謝你。你可以告訴我,如果我想選擇另一個事件,那麼它顯示兩個單選按鈕,所以我想重置前一個。 –

+0

而不是保持EventModel的狀態,只保留適配器類上的最後更新的位置(最初它將是-1)。然後檢查'onBindViewHolder'方法中的最後一個位置是否匹配並應用背景圖像。 –