2017-05-28 66 views
1

私のアプリでRecyclerViewを使用していますが、RecyclerViewをスクロールするとアイテムが消えます!私はこのコードを多くのRecyclerViewに使用しましたが、今回は何が起こっているのか分かりません。スクロールでRecyclerViewアイテムが消える理由

public class ActivityStartup extends AppCompatActivity { 

    Toolbar toolbar; 
    DrawerLayout drawerLayout; 
    NavigationView navigationView; 
    RecyclerView menuListRecycler; 
    RecyclerView schedualRecycler; 

    private List<ReminderModel> tempSchedualArray = new ArrayList<>(); 

    /** 
    * ATTENTION: This was auto-generated to implement the App Indexing API. 
    * See https://g.co/AppIndexing/AndroidStudio for more information. 
    */ 
    private GoogleApiClient client; 
    LinearLayoutManager mSchedualLayoutManager = new LinearLayoutManager(ActivityStartup.this); 
    private FloatingActionButton mAddReminderButton; 
    RecyclerView.Adapter mSchedualAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    toolbar = (Toolbar) findViewById(R.id.toolBar); 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    navigationView = (NavigationView) findViewById(R.id.navigationView); 
    menuListRecycler = (RecyclerView) findViewById(R.id.menuList); 
    schedualRecycler = (RecyclerView) findViewById(R.id.acitvityStartup_recycler_scheduals); 

    //Setting Customized toolbar for application 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    LinearLayoutManager mEventsLayoutManager = new LinearLayoutManager(ActivityStartup.this); 
    menuListRecycler.setLayoutManager(mEventsLayoutManager); 
    RecyclerView.Adapter mEventsAdapter = new MenuAdapter(G.menuItems, ActivityStartup.this); 
    menuListRecycler.setAdapter(mEventsAdapter); 
    mAddReminderButton = (FloatingActionButton) findViewById(R.id.add_reminder); 

    //Setting up recyclerView of events 
    populateSchedualArray(); 

    schedualRecycler.setLayoutManager(mSchedualLayoutManager); 
    mSchedualAdapter = new SchedualAdapter(populateSchedualArray(), ActivityStartup.this); 
    schedualRecycler.setAdapter(mSchedualAdapter); 

    // On clicking the floating action button 
    mAddReminderButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     Intent intent = new Intent(v.getContext(), ReminderAddActivity.class); 
     startActivity(intent); 
     } 
    }); 

    } 

    @Override 
    protected void onResume() { 
    super.onResume(); 

    mSchedualAdapter = new SchedualAdapter(populateSchedualArray(), ActivityStartup.this); 
    schedualRecycler.setAdapter(mSchedualAdapter); 
    } 



    private ArrayList<ReminderModel> populateSchedualArray() { 

    ArrayList<ReminderModel> schedualArray = new ArrayList<>(); 

    Database rb = new Database(ActivityStartup.this); 
    tempSchedualArray = rb.getAllReminders(); 

    ArrayList<ReminderModel> monthOne = new ArrayList<>(); 
    ArrayList<ReminderModel> monthTwo = new ArrayList<>(); 
    ArrayList<ReminderModel> monthThree = new ArrayList<>(); 
    ArrayList<ReminderModel> monthFour = new ArrayList<>(); 
    ArrayList<ReminderModel> monthFive = new ArrayList<>(); 
    ArrayList<ReminderModel> monthSix = new ArrayList<>(); 
    ArrayList<ReminderModel> monthSeven = new ArrayList<>(); 
    ArrayList<ReminderModel> monthEight = new ArrayList<>(); 
    ArrayList<ReminderModel> monthNine = new ArrayList<>(); 
    ArrayList<ReminderModel> monthTen = new ArrayList<>(); 
    ArrayList<ReminderModel> monthEleven = new ArrayList<>(); 
    ArrayList<ReminderModel> monthTwelve = new ArrayList<>(); 

    for (ReminderModel rm : tempSchedualArray) { 

     String[] split = rm.getDate().split("/"); 
     switch (split[1]) { 
     case "1": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthOne.add(rm); 
      break; 
     case "2": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthTwo.add(rm); 
      break; 
     case "3": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthThree.add(rm); 
      break; 
     case "4": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthFour.add(rm); 
      break; 
     case "5": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthFive.add(rm); 
      break; 
     case "6": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthSix.add(rm); 
      break; 
     case "7": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthSeven.add(rm); 
      break; 
     case "8": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthEight.add(rm); 
      break; 
     case "9": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthNine.add(rm); 
      break; 
     case "10": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthTen.add(rm); 
      break; 
     case "11": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthEleven.add(rm); 
      break; 
     case "12": 
      rm.setDate(convertDateToGregorian(split[2], split[1], split[0])); 
      monthTwelve.add(rm); 
      break; 
     } 


    } 

    schedualArray.add(new ReminderModel(100000001, "start_spring", "", "", "", "", "", "")); 
    schedualArray.addAll(monthOne); 
    schedualArray.addAll(monthTwo); 
    schedualArray.addAll(monthThree); 
    schedualArray.add(new ReminderModel(100000004, "start_summer", "", "", "", "", "", "")); 
    schedualArray.addAll(monthFour); 
    schedualArray.addAll(monthFive); 
    schedualArray.addAll(monthSix); 
    schedualArray.add(new ReminderModel(100000007, "start_fall", "", "", "", "", "", "")); 
    schedualArray.addAll(monthSeven); 
    schedualArray.addAll(monthEight); 
    schedualArray.addAll(monthNine); 
    schedualArray.add(new ReminderModel(1000000010, "start_winter", "", "", "", "", "", "")); 
    schedualArray.addAll(monthTen); 
    schedualArray.addAll(monthEleven); 
    schedualArray.addAll(monthTwelve); 

    return schedualArray; 
    } 

    private String convertDateToGregorian(String year, String month, String day) { 

    CalendarTool calendarTool = new CalendarTool(); 
    calendarTool.setIranianDate(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day)); 

    return calendarTool.getGregorianYear() + "/" + calendarTool.getGregorianMonth() + "/" + calendarTool.getGregorianDay(); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

    if (id == android.R.id.home) { 
     Toast.makeText(this, "دکمه خانه کلیک شد !", Toast.LENGTH_SHORT).show(); 
    } 
    if (id == R.id.action_settings) { 
     drawerLayout.openDrawer(Gravity.RIGHT); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
    } 

    /** 
    * ATTENTION: This was auto-generated to implement the App Indexing API. 
    * See https://g.co/AppIndexing/AndroidStudio for more information. 
    */ 
    public Action getIndexApiAction() { 
    Thing object = new Thing.Builder() 
     .setName("Main Page") // TODO: Define a title for the content shown. 
     // TODO: Make sure this auto-generated URL is correct. 
     .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) 
     .build(); 
    return new Action.Builder(Action.TYPE_VIEW) 
     .setObject(object) 
     .setActionStatus(Action.STATUS_TYPE_COMPLETED) 
     .build(); 
    } 

    @Override 
    public void onStart() { 
    super.onStart(); 
    } 

    @Override 
    public void onStop() { 
    super.onStop(); 
    } 


} 

、これは私が使用私のアダプタクラスです: そこに私のコードは私の活動のためにある

public class SchedualAdapter extends RecyclerView.Adapter<SchedualAdapter.ViewHolder> { 
    private ArrayList<ReminderModel> items; 
    private Context mContext; 


    public SchedualAdapter(ArrayList<ReminderModel> items, Context mContext) { 
    this.items = items; 
    this.mContext = mContext; 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

    TextView txtDateNumber; 
    TextView txtDateName; 
    TextView txtEventTitle; 
    TextView txtMonthName; 
    ImageView imgMonth; 
    LinearLayout layoutTop; 

    public ViewHolder(View v) { 
     super(v); 

     txtDateNumber = (TextView) v.findViewById(R.id.txt_dateNumber); 
     txtDateName = (TextView) v.findViewById(R.id.txt_dateName); 
     txtEventTitle = (TextView) v.findViewById(R.id.txt_eventTitle); 
     txtMonthName = (TextView) v.findViewById(R.id.txt_monthName); 
     imgMonth = (ImageView) v.findViewById(R.id.img_monthPic); 
     layoutTop = (LinearLayout) v.findViewById(R.id.layoutTop); 
    } 
    } 

    @Override 
    public SchedualAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    // Create a new View 
    final View v = LayoutInflater.from(mContext).inflate(R.layout.schedual_recycler_item, parent, false); 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 

    if (items.get(position).getTitle().equals("start_spring")) { 

     holder.imgMonth.setVisibility(View.VISIBLE); 
     holder.imgMonth.setImageResource(R.drawable.spring); 
     holder.txtDateName.setVisibility(View.GONE); 
     holder.txtDateNumber.setVisibility(View.GONE); 
     holder.txtEventTitle.setVisibility(View.GONE); 
    } else if (items.get(position).getTitle().equals("start_summer")) { 
     holder.imgMonth.setVisibility(View.VISIBLE); 
     holder.imgMonth.setImageResource(R.drawable.summer); 
     holder.txtDateName.setVisibility(View.GONE); 
     holder.txtDateNumber.setVisibility(View.GONE); 
     holder.txtEventTitle.setVisibility(View.GONE); 
    } else if (items.get(position).getTitle().equals("start_fall")) { 
     holder.imgMonth.setVisibility(View.VISIBLE); 
     holder.imgMonth.setImageResource(R.drawable.fall); 
     holder.txtDateName.setVisibility(View.GONE); 
     holder.txtDateNumber.setVisibility(View.GONE); 
     holder.txtEventTitle.setVisibility(View.GONE); 
    } else if (items.get(position).getTitle().equals("start_winter")) { 
     holder.imgMonth.setVisibility(View.VISIBLE); 
     holder.imgMonth.setImageResource(R.drawable.winter); 
     holder.txtDateName.setVisibility(View.GONE); 
     holder.txtDateNumber.setVisibility(View.GONE); 
     holder.txtEventTitle.setVisibility(View.GONE); 
    } else { 

     holder.imgMonth.setVisibility(View.GONE); 

     holder.layoutTop.setVisibility(View.VISIBLE); 
     holder.txtEventTitle.setText(items.get(position).getTitle()); 
     holder.txtDateNumber.setText(items.get(position).getDate()); 

     CalendarTool c = new CalendarTool(); 

     if (!items.get(position).getDate().equals("")) { 

     String[] split = items.get(position).getDate().split("/"); 
     c.setIranianDate(Integer.parseInt(split[2]), Integer.parseInt(split[1]), Integer.parseInt(split[0])); 
     holder.txtDateName.setText("" + c.getDayOfWeek()); 
     } 

    } 


    setAnimation(holder.itemView, position); 

    } 

    private int lastPosition = -1; 

    private void setAnimation(View viewToAnimate, int position) { 
    // If the bound view wasn't previously displayed on screen, it's animated 
    if (position > lastPosition) { 
     ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
     anim.setDuration(new Random().nextInt(501));//to make duration random number between [0,501) 
     viewToAnimate.startAnimation(anim); 
     lastPosition = position; 
    } 
    } 

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

私は私の項目が消えます方法を理解することはできません! 私を助けることができれば本当に感謝しています。 ありがとうございます。

答えて

1

を提供する必要があります:

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.ArrayList; 

import free.calendar.app.codenevisha.com.hamrahcalendar.R; 
import model.ReminderModel; 
import utils.G; 

import static utils.G.SEASON_WINTER; 


public class SchedualAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private ArrayList<ReminderModel> items; 
    private Context mContext; 


    public SchedualAdapter(ArrayList<ReminderModel> items, Context mContext) { 
    this.items = items; 
    this.mContext = mContext; 
    } 

    public static class ViewHolderDefault extends RecyclerView.ViewHolder { 

    TextView txt_eventTitle; 
    TextView txt_dateNumber; 
    TextView txt_dateName; 

    public ViewHolderDefault(View v) { 
     super(v); 

     txt_eventTitle = (TextView) v.findViewById(R.id.txt_eventTitle); 
     txt_dateName = (TextView) v.findViewById(R.id.txt_dateName); 
     txt_dateNumber = (TextView) v.findViewById(R.id.txt_dateNumber); 

    } 
    } 

    public static class ViewHolderSeason extends RecyclerView.ViewHolder { 

    ImageView img_monthPic; 

    public ViewHolderSeason(View v) { 
     super(v); 
     img_monthPic = (ImageView) v.findViewById(R.id.img_monthPic); 
    } 
    } 

    @Override 
    public int getItemViewType(int position) { 

    /* 
    * 0 default 
    * 1 spring 
    * 2 Summer 
    * 3 fall 
    * 4 winter 
    */ 

    int state; 
    String title = G.COMMON_DAY; 
    if (items.get(position).getTitle().equals(G.SEASON_SPRING)) { 
     return 1; 
    } else if (items.get(position).getTitle().equals(G.SEASON_SUMMER)) { 
     return 2; 
    } else if (items.get(position).getTitle().equals(G.SEASON_FALL)) { 
     return 3; 
    } else if (items.get(position).getTitle().equals(SEASON_WINTER)) { 
     return 4; 
    } 
    return 0; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    // Create a new View 
    final View v1 = LayoutInflater.from(mContext).inflate(R.layout.schedual_recycler_default_viewgroup, parent, false); 

    final View v2 = LayoutInflater.from(mContext).inflate(R.layout.schedual_recycler_seasion_viewgroup, parent, false); 


    if (viewType == 0) { 
     return new ViewHolderDefault(v1); 
    } else { 
     return new ViewHolderSeason(v2); 
    } 
    } 

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


    switch (holder.getItemViewType()) { 
     case 0: 
     ViewHolderDefault viewHolderDefault = (ViewHolderDefault) holder; 
     viewHolderDefault.txt_dateNumber.setText(items.get(position).getDate()); 
     viewHolderDefault.txt_dateNumber.setText(items.get(position).getDate()); 
     break; 

     case 1: 
     ViewHolderSeason viewHolderSeason1 = (ViewHolderSeason) holder; 
     viewHolderSeason1.img_monthPic.setImageResource(R.drawable.spring); 
     break; 

     case 2: 
     ViewHolderSeason viewHolderSeason2 = (ViewHolderSeason) holder; 
     viewHolderSeason2.img_monthPic.setImageResource(R.drawable.summer); 
     break; 

     case 3: 
     ViewHolderSeason viewHolderSeason3 = (ViewHolderSeason) holder; 
     viewHolderSeason3.img_monthPic.setImageResource(R.drawable.fall); 
     break; 

     case 4: 
     ViewHolderSeason viewHolderSeason4 = (ViewHolderSeason) holder; 
     viewHolderSeason4.img_monthPic.setImageResource(R.drawable.winter); 
     break; 
    } 
    } 


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

単純な位置(実際にはadapterPosition AFAIK)ではなく、getAdapterPosition/getLayoutPositionを使用してください。それらの違いについて読んでください。これは役に立ちます。あなたがいない場合は、アイテムの異なるViewTypeを使用しようとします。幸運

1

リサイクラビューは、その名前が示すように、リソース集約的な新しいものを描画しないように既に描画されている同じタイプの既存アイテムのビュータイプを再利用します。

ここでこのラインはあなたの犯人holder.layoutTop.setVisibility(View.VISIBLE);よりもむしろif-elseviewtypesの使用を探るonBindViewHolderに使用される言われていること。これは、リサイクラのビューアイテムに異なるレイアウトを実装する正しい方法です。このstackoverflowの質問は、VISIBLEまたはそれらのためGONEを設定することは適切ではなく、最良の方法は、このようなrecyclerView何かのために複数のviewHolderを使用することですrecyclerViewでmuntipleビューを使用するためのいくつかの洞察力にHow to create RecyclerView with multiple view type?

2

私は同じ問題(https://github.com/square/picasso/issues/845)を持っていましたが、githubでこれが見つかり、私のために働いていました。タクを@ raj9686にする

rv.getRecycledViewPool().setMaxRecycledViews(0, 0); 
関連する問題