Поисковый фильтр в обзоре переработчика после того, как фильтр неправильно выбрал проблему - PullRequest
0 голосов
/ 09 марта 2019

У меня есть просмотрщик и текст редактирования.Я могу выбрать элемент из окна восстановления и получить правильный элемент, если он не отфильтрован.При вводе в edittext Recyclerview список фильтруется, когда я выбираю любой элемент из списка, он показывает мне фактический элемент списка вместо выбранного.

Мой фрагмент класса:

public class HomeFragment extends Fragment  {

List<ActivityCell> lstActivity ;
public  ActivityCell_RecyclerViewAdapter myAdapter;
public RecyclerView myrv;

ClockPieView clockPieView;

//Notification
private static final int NOTIFICATION_ID = 1;
private CharSequence notificationTitleText = "Hello Title";
private CharSequence notificationDescText = "This is custom Notification desc";
public long timeDifference = 0;
Chronometer chronometer;
public long pauseOffset;

LinearLayout snacklayout;
// Session Manager Class
SessionManager session;

//sessiondan alacağımız Stringlerimizi kaydedeceğimiz Stringler
String username, sifre;
String userID;

//TextViewlerimiz
TextView txt_deneme_sifre;
TextView main_head_txt;
String HeaderFirstStep;

//Fab
FloatingActionButton fabHomeBtn;




@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home,container,false);




        final DatabaseHelper mdb = new DatabaseHelper(getActivity());

    lstActivity = new ArrayList<>();

    Cursor cursor = mdb.getAction();

    while (cursor.moveToNext()){

        String draw_name = cursor.getString(1);

        int id = getResources().getIdentifier(draw_name, "drawable",getActivity().getPackageName());


        //int img_id = Integer.parseInt(cursor.getString(1));

        lstActivity.add(new ActivityCell(cursor.getString(0),id,10));

    }
    myrv = (RecyclerView) view.findViewById(R.id.homefragment_recyclerview_id);
    myAdapter = new ActivityCell_RecyclerViewAdapter(getActivity(),lstActivity);
    myrv.setLayoutManager(new GridLayoutManager(getActivity(),2));
    myrv.setAdapter(myAdapter);


    EditText Search_edittext = (EditText) view.findViewById(R.id.Search_edittext);
    Search_edittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            filter(s.toString());
        }
    });



    return view;
}

private void filter(String text) {
    ArrayList<ActivityCell> filteredList = new ArrayList<>();

    for (ActivityCell item : lstActivity) {
        if (item.getTitle().toLowerCase().contains(text.toLowerCase())) {
            filteredList.add(item);
        }
    }

    myAdapter.filterList(filteredList);

}


@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    snacklayout=(LinearLayout) getActivity().findViewById(R.id.home_Linear_layout);
    //TextView tanımlamaları
    main_head_txt = (TextView) getActivity().findViewById(R.id.main_head_txt);
    txt_deneme_sifre = (TextView) getActivity().findViewById(R.id.txt_deneme_sifre);





    final DatabaseHelper mdb1 = new DatabaseHelper(getActivity());

    session = new SessionManager(getActivity());

    // sessiondan kullanıcı verilerini almak için nesnemizi oluşturduk.
    HashMap<String, String> user = session.getUserDetails();

    //keylerine göre user nesnemizden verilerimizi çağırdık ve ekledik.
    try {
        userID = user.get(SessionManager.KEY_USERID);
    } catch(NumberFormatException nfe) {
        System.out.println("Could not parse " + nfe);
    }


    mdb1.getWritableDatabase();



    Cursor cursor = mdb1.getProfile(userID);
    while (cursor.moveToNext()){
        String firstname = cursor.getString(0);
        setHeaderMessage();

        main_head_txt.setText(HeaderFirstStep+" "+ firstname);

    }

Мой класс адаптера

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



private Context mContext ;
private List<ActivityCell> mData ;
public  int activity_state = 0;
public LinearLayout snacklayout;
public String activity_name;


private android.support.v4.app.NotificationCompat.Builder builder;
private NotificationManager notificationManager;
private int notification_id=0;
private RemoteViews remoteViews;
private Context context;
PendingIntent pendingIntent;

// Session Manager Class
SessionManager session;

//sessiondan alacağımız Stringlerimizi kaydedeceğimiz Stringler
String userID;

public ActivityCell_RecyclerViewAdapter(Context mContext, List<ActivityCell> mData) {
    this.mContext = mContext;
    this.context=mContext;
    this.mData = mData;

}



@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view ;






    LayoutInflater mInflater = LayoutInflater.from(mContext);
    view = mInflater.inflate(R.layout.cardview_item_activity,parent,false);

    return new MyViewHolder(view);


}

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    final DatabaseHelper mdb = new DatabaseHelper(mContext);
    mdb.getWritableDatabase();
    final boolean[] isChronometerRunning = new boolean[100];


    // session verileri için sınıfımızı çağırdık
    session = new SessionManager(mContext.getApplicationContext());

    // sessiondan kullanıcı verilerini almak için nesnemizi oluşturduk.
    HashMap<String, String> user = session.getUserDetails();

    //keylerine göre user nesnemizden verilerimizi çağırdık ve ekledik.
    userID = user.get(SessionManager.KEY_USERID);

    holder.activity_chr_id.setTextColor(mContext.getColor(R.color.white));
    holder.activity_title_id.setText(mData.get(position).getTitle());

    holder.activity_chr_id.setBase(elapsedRealtime());
    holder.cardview_activity_img_id.setImageResource(mData.get(position).getThumbnail());

    isChronometerRunning[position]= false;

    Cursor cursor = mdb.getActionColor(mData.get(position).getTitle());

    while (cursor.moveToNext()){

        String color_icon = cursor.getString(0);
        holder.cardview_activity_img_id.setColorFilter(Color.parseColor(color_icon));

    }



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



            HomeFragment fragment=new HomeFragment();




            //!  holder.activity_chr_id.getText().toString().equals("00:00")

            if ( isChronometerRunning[position] ){

                activity_name=holder.activity_title_id.getText().toString();
                holder.activity_chr_id.stop();
                mdb.updateFinishDate(activity_name);
                holder.activity_chr_id.setBase(elapsedRealtime());
                holder.activity_chr_id.setTextColor(Color.parseColor("#ffffff"));

                Cursor cursor = mdb.getActionColor(mData.get(position).getTitle());

                while (cursor.moveToNext()){

                    String color_icon = cursor.getString(0);
                    holder.cardview_activity_img_id.setColorFilter(Color.parseColor(color_icon));

                }

                holder.cardView.setCardBackgroundColor(Color.parseColor("#ffffff"));
                holder.activity_title_id.setTextColor(Color.parseColor("#2d2d2d"));
                activity_state=activity_state-1;
                isChronometerRunning[position]= false;

                notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
                builder = new android.support.v4.app.NotificationCompat.Builder(context);
                Intent button_intent = new Intent("button_clicker");
                button_intent.putExtra("idd", notification_id);

                PendingIntent button_pending_event = PendingIntent.getBroadcast(context, notification_id,
                        button_intent, 0);


                remoteViews.setOnClickPendingIntent(R.id.button, button_pending_event);

                Intent notification_intent = new Intent(context, Home.class);
                pendingIntent = PendingIntent.getActivity(context, 0, notification_intent, 0);
                notificationManager.cancel(position);









            }
            else if (activity_state <3 && ! isChronometerRunning[position] ){

                //fragment.ShowNotification();
                activity_name=holder.activity_title_id.getText().toString();
                mdb.addData(activity_name,Integer.parseInt(userID.toString()));
                holder.activity_chr_id.setBase(elapsedRealtime());
                holder.activity_chr_id.start();
                holder.cardview_activity_img_id.setColorFilter(Color.parseColor("#ffffff"));
                holder.activity_chr_id.setTextColor(Color.parseColor("#ffffff"));
                holder.cardView.setCardBackgroundColor(Color.parseColor(BackgroundColorSet(activity_name)));
                holder.activity_title_id.setTextColor(Color.parseColor("#ffffff"));
                boolean deneme2 = holder.activity_chr_id.isActivated();

                isChronometerRunning[position]= true;

                notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
                builder = new android.support.v4.app.NotificationCompat.Builder(context);

                remoteViews = new RemoteViews(context.getPackageName(),R.layout.custom_notification);
                remoteViews.setImageViewResource(R.id.notif_icon, mData.get(position).getThumbnail());
                remoteViews.setChronometer(R.id.notif_Chronometer, SystemClock.elapsedRealtime(),
                        null, true); //pausing
                remoteViews.setTextViewText(R.id.notif_title,holder.activity_title_id.getText().toString());
                    notification_id = (int) position;

                builder.setSmallIcon(R.drawable.login_logo)

                        .setOngoing(true)
                        .setCustomContentView(remoteViews)
                        .setCustomBigContentView(remoteViews)
                        .setContentIntent(pendingIntent);

                ButtonListener test = new ButtonListener();


                Intent button_intent = new Intent("button_clicker");

                button_intent.putExtra("idd", notification_id);

                PendingIntent button_pending_event = PendingIntent.getBroadcast(context, notification_id,
                        button_intent, 0);


                remoteViews.setOnClickPendingIntent(R.id.button, button_pending_event);




                Intent notification_intent = new Intent(context, Home.class);
                notification_intent.putExtra("idd", notification_id);
                pendingIntent = PendingIntent.getActivity(context, 0, notification_intent, 0);








                notificationManager.notify(notification_id, builder.build());






                activity_state++;

            }
            else
            {
                Snackbar.make(v,"Aynı Anda 3 ten fazla etkinlik oluşturulamaz", Snackbar.LENGTH_LONG).show();

            }



        }
    });



}

public String  BackgroundColorSet(String activity_name)
{
    final DatabaseHelper mdb = new DatabaseHelper(mContext);
    mdb.getWritableDatabase();
    String BackgroundColorname = "";

    Cursor cursor = mdb.getActionColor(activity_name);

    while (cursor.moveToNext()){

        BackgroundColorname = cursor.getString(0);


    }

    return BackgroundColorname;

}

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

public static class MyViewHolder extends RecyclerView.ViewHolder {

    TextView activity_title_id;
    ImageView cardview_activity_img_id;
    CardView cardView ;
    Chronometer activity_chr_id;




    public MyViewHolder(View itemView) {
        super(itemView);



        activity_title_id = (TextView) itemView.findViewById(R.id.activity_title_id) ;
        cardview_activity_img_id = (ImageView) itemView.findViewById(R.id.cardview_activity_img_id);
        cardView = (CardView) itemView.findViewById(R.id.item_cardview_id);
        activity_chr_id = (Chronometer)  itemView.findViewById(R.id.activity_chr_id);



    }
}

public void filterList(ArrayList<ActivityCell> filteredList) {
    mData = filteredList;
    notifyDataSetChanged();
}
}

Вот мои примеры изображений

Первое состояние first state

Фильтрующий элемент filtering item

Отображается последнее состояние неправильного элемента last state wrong item appears

1 Ответ

0 голосов
/ 09 марта 2019

Ваша проблема схожа с этой проблемой, Фон элемента RecyclerView чередуется с цветом не по порядку

"Это потому, что RecyclerView перерабатывает ваши старые представления для создания новых представлений. Когда вы прокручиваете вниз, старые представления используются для создания новых, так как цвет фона этих старых представлений уже был установлен при вызове onBindViewHolder, у вас есть чтобы указать условие else в onBindViewHolder, которое изменит цвет и поддержит чередующийся порядок цветов. "

Вероятно ActivityCell возвращается из mData.get(position), поэтому я рекомендую добавить логическое поле к имени объекта ActivityCell, это isHighlighted / isSelected, поэтому при нажатии сделать isSelected = true, и самое важное, когда вы связываете элементы , примените эффект выделения / щелчка к вашей ячейке, если isSelected - true.

...