фильтровать recyclerview, извлекая данные из mysql, используя модификацию

avatar
Adnan Ijaz
8 апреля 2018 в 07:32
415
0
0

Я разрабатываю приложение для Android, в котором у нас есть панель поиска, если мы вводим что-либо в строке поиска, она извлекает данные из mysql, используя модификацию и фильтрацию recyclerview в соответствии с вводом от пользователя. Вот код

Manage_Schedule.java (MainActivity) В этом классе у нас есть функциональность представления поиска, но у меня возникла ошибка В для каждой петли for(String nameee: subjects) Это дает ошибку, и если мы решим ее, она преобразует класс String в класс модели (Темы: он содержит геттер и сеттер содержимого, которое вы хотите отобразить). Но если мы преобразуем его в for (Subjects nameee: subjects) произошла другая ошибка, в которой говорится, что имя не является строкой, поэтому мы не можем использовать toLowercase() и содержать в нем метод if (nameee.toLowerCase().contains(userInput)) { newList.add(nameee); }

Вот код

public class Manage_Schedule extends AppCompatActivity implements SearchView.OnQueryTextListener{
private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclearAdapterSubjects adapter;
private List<Subjects> subjects;
private ApiInterface apiInterface;
AlertDialog dialog;
private Button viewSchedule;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_schedule_subjects);
    recyclerView = (RecyclerView)findViewById(R.id.subjectsDetail);
    viewSchedule = (Button)findViewById(R.id.viewSubjectsSchedule);
    layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setHasFixedSize(true);
    dialog= new SpotsDialog(this,R.style.Custom);
    dialog.show();
    apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
    Call<List<Subjects>> call= apiInterface.getSubjects();

    call.enqueue(new Callback<List<Subjects>>() {
        @Override
        public void onResponse(Call<List<Subjects>> call, Response<List<Subjects>> response) {
            subjects = response.body();
            adapter =new RecyclearAdapterSubjects(subjects,getApplicationContext());
            recyclerView.setAdapter(adapter);
            dialog.dismiss();
        }

        @Override
        public void onFailure(Call<List<Subjects>> call, Throwable t) {
            dialog.dismiss();
        }
    });


    //View Schedule On Schedule button clicked
    viewSchedule.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        startActivity(new Intent(Manage_Schedule.this,scheduled_Subjects.class));
        }
    });


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.toolbar_menu,menu);

    // We have to register SearchView to this listenear
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchView  = (SearchView)menuItem.getActionView();
    searchView.setOnQueryTextListener(this);

    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {
    String userInput = newText.toLowerCase();
    List<Subjects> newList = new ArrayList<>();
    for (String nameee: subjects)
    {
        if (nameee.toLowerCase().contains(userInput))
        {
            newList.add(nameee);
        }
    }
    adapter.updateList(newList);
    return true;

}
}

Вот класс адаптера

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

          List<Subjects> subjects;
         public Context context;
          public DatabaseHelper mDatabaseHelper;

          public RecyclearAdapterSubjects(List<Subjects> subjects,Context                                   
          context)
{
    this.subjects = subjects;
    this.context =context;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout,parent,false);
    return new MyViewHolder(view,context,subjects);
}

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

    holder.sName.setText(subjects.get(position).getsName());
    holder.sCode.setText(subjects.get(position).getsCode());
}

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


public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView sName, sCode;
    Context context;
    LinearLayout layout;
    List<Subjects> subjects;

    public MyViewHolder(View itemView, Context context, List<Subjects> subjects) {
        super(itemView);
        this.context = context;
        this.subjects = subjects;
        itemView.setOnClickListener(this);
        layout = (LinearLayout) itemView.findViewById(R.id.linearTopMost);
        sName = (TextView) itemView.findViewById(R.id.subjectName);
        sCode = (TextView) itemView.findViewById(R.id.subjectCode);

    }

    @Override
    public void onClick(View view) {
        mDatabaseHelper = new DatabaseHelper(context);
        int position = getAdapterPosition();
        Subjects obj = this.subjects.get(position);
        Toast.makeText(context, obj.getsName() + "", 
   Toast.LENGTH_SHORT).show();

        System.out.println("In OnClick Upper Side");

        try {
            String Subject_name = obj.getsName();
            //mDatabaseHelper.getWritableDatabase();
            boolean insertData = mDatabaseHelper.addData(Subject_name + "");


            if (insertData) {
                Toast.makeText(context, "Data inserted", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "Something went wrong", Toast.LENGTH_SHORT).show();
            }
        } catch (Exception e) {
            System.out.println("Exception handling here");
        }
        System.out.println("In OnClick Lower Side");

    }


}

//Call when filter RecyclearView

public void updateList(List<Subjects> newList)
{
    subjects = newList;
    subjects.addAll(newList);
    notifyDataSetChanged();
}
}

Просто проверьте, как я могу разрешить функцию поиска, recyclerview работает нормально. Почему никто не отвечает

Источник
nasch
16 апреля 2018 в 02:53
0

Какую ошибку вы получаете, когда объявляете ее как строку?

Adnan Ijaz
17 апреля 2018 в 16:15
0

@nasch bro, когда вы вводите что-то на панели инструментов (панели поиска), recyclerview фильтруется, но не выполняет правильные действия. Ошибка «FATAL EXCEPTION: main Process: com.example.madnanijaz.loginsimplifiedvolley, PID: 4114 java.lang.ArrayIndexOutOfBoundsException: length=15; index=-1 at java.util.ArrayList.get(ArrayList.java:413) at com.example.madnanijaz.loginsimplifiedvolley.SubjectsFetchingFromServer.RecyclearAdapterSubjects$MyViewHolder.onClick(RecyclearAdapterSubjects.java:124) at" Это ошибка

nasch
17 апреля 2018 в 22:10
0

Итак, по какой-то причине адаптер сообщает текущую позицию как -1, а затем вы пытаетесь использовать ее как индекс списка, что не работает.

Adnan Ijaz
18 апреля 2018 в 00:34
0

@nasch, подскажите, пожалуйста, как это решить?

nasch
18 апреля 2018 в 16:35
0

Я не уверен, я бы провел некоторое исследование адаптеров RecyclerView. Как только вы поймете их лучше, станет ясно, в чем проблема.

Ответы (0)