2017-12-09 2 views
0

비동기 작업에서 데이터를 가져 오는 recyclerview를 필터링하는 actionBar에 SearchView를 구현하려했으나 제대로 작동하지 않는 것 같습니다. .비동기 작업에서 데이터를 가져 오는 RecyclerView 검색

내가 본 모든 답변에 대해 recycler 클래스 용 어댑터는 SearchView와 동일한 클래스에 있습니다. 하지만 내 애플 리케이션에서 어댑터가 Async 클래스에있는 동안 Searchview 조각에 있습니다. 내 UI 스레드가 느려지거나 내 응용 프로그램이 RecyclerView의 항목을로드하려고 할 때 충돌을 일으키지 않기 때문에 Async 클래스를 만들었습니다. 벨로 우가 나의 암호 다. 어떤 도움도 사랑 스럽다.

마지막으로 내 조각을 위해 몇 가지 코드를 사용하여 대부분의 코드를 잘라내어 질문과 관련된 것을 남겨 두었습니다. 감사. MyAsync.java

public class MyAsync extends AsyncTask<Void,RafTask,Void>{ 

private RecyclerView recyclerView; 
private ProgressBar progressBar; 
private Context context; 
private static ClientRecycler recycler; 
private SearchView searchView; 
private ArrayList<RafTask> newLists = new ArrayList<>(); 
String am; 
private static ArrayList<RafTask> raftask = new ArrayList<>(); 
private static final String TAG = "ListDataActivity"; 

public MyAsync(RecyclerView recyclerView, ProgressBar progressBar,Context context, ArrayList<RafTask> newList){ 

    this.recyclerView = recyclerView; 
    this.progressBar = progressBar; 
    this.context = context; 
    this.newLists = newList; 
} 

@Override 
protected void onPreExecute() { 

    recycler = new ClientRecycler(raftask); 
    recyclerView.setAdapter(recycler); 
    progressBar.setVisibility(View.VISIBLE); 
} 


@Override 
protected Void doInBackground(Void... voids) { 


    MyHelper mHelper = new MyHelper(context,null,null,1); 

    SQLiteDatabase database = mDatabaseHelper.getReadableDatabase(); 


    String Name; 
    int count = 0; 
    Cursor c = mHelper.getRafData(); 



    while(c.moveToNext()){ 

     //Database codes 
     publishProgress(new RafTask(Name,"","",String.valueOf(count),"","")); 

    return null; 
} 

@Override 
protected void onProgressUpdate(RafTask... value) { 
    raftask.add(value[0]); 
    recycler.notifyDataSetChanged(); 
} 

@Override 
protected void onPostExecute(Void aVoid) { 

    progressBar.setVisibility(View.GONE); 
    Log.d(TAG, "fragment text pass: " + am); 
} 
public static void setFilter(ArrayList<RafTask> newList){ 
    // newList = newLists; 
    raftask = new ArrayList<>(); 
    raftask.addAll(newList); 
    recycler.notifyDataSetChanged(); 
} 
} 

에 대한 그리고 Rafadapter.java

public class RafRecycler extends RecyclerView.Adapter<RafRecycler.MyViewHolder> { 
private static ArrayList<RafTask> rafTasks = new ArrayList<>(); 



public RafRecycler(ArrayList<RafTask> rafTasks){ 
    this.rafasks = rafTasks; 

} 

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

} 

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

    holder.name.setText(rafTasks.get(position).get_raftaskname()); 
    holder.id.setText(String.valueOf(rafTasks.get(position).get_raftaskid())+"."); 
    // holder.id.setText(String.valueOf("->")); 


    holder.m = rafTasks.get(position).get_raftaskid(); 

} 

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

public static class MyViewHolder extends RecyclerView.ViewHolder{ 

    TextView id,name; 
    String m; 



    public MyViewHolder(View itemView) { 
     super(itemView); 
     id = itemView.findViewById(R.id.txt_id); 
     name = itemView.findViewById(R.id.txt_name); 
     m=itemView.toString(); 


     final MyDatabaseHelper mDatabaseHelper = new MyDatabaseHelper(itemView.getContext(),null,null,1); 





     final boolean clicked = false; 

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

       String names = name.getText().toString(); 

       Cursor c = mHelper.getClientItemID(names); 
       int itemID = -1; 
       String email = ""; 
       String address = ""; 
       String shipaddress = ""; 
       String number = ""; 
       while (c.moveToNext()){ 

        //Chech here for the codes to edit all plus numbers 
        // 
        // 
        itemID = c.getInt(0); 
        address =c.getString(4); 
        number =c.getString(2); 
        shipaddress =c.getString(5); 
        email =c.getString(3); 
       } 
       if(itemID >-1){ 
        Log.d(TAG, "onItemClick: The id is: " + itemID); 
        Log.d(TAG, "onItemClick: The desc is: " + address); 
        Log.d(TAG, "onItemClick: The price is: " + shipaddress); 
        Intent editScreenIntent = new Intent(v.getContext(), EditClientActivity.class); 
        editScreenIntent.putExtra("id", itemID); 
        editScreenIntent.putExtra("name", names); 
        editScreenIntent.putExtra("number", number); 
        editScreenIntent.putExtra("address", address); 
        editScreenIntent.putExtra("email", email); 
        editScreenIntent.putExtra("shipaddress", shipaddress); 
        v.getContext().startActivity(editScreenIntent); 
        ((MainActivity) v.getContext()).overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left); 
       }else{ 
        Toast.makeText(v.getContext(),"No idd clicked", Toast.LENGTH_SHORT).show(); 
       } 

      } 

     }); 
    } 
} 

public void setFilter(ArrayList<ClientTask> newList){ 
    clientTasks = new ArrayList<>(); 
    clientTasks.addAll(newList); 
    notifyDataSetChanged(); 
} 
} 

그리고 마지막으로 내 fragment.java 내 코드의

public class ClientFragment extends Fragment implements SearchView.OnQueryTextListener { 

private static final String TAG = "ListDataActivity"; 
MyDatabaseHelper mDatabaseHelper; 
private ProgressBar progressBar; 
private RecyclerView recyclerView; 
public static SearchView searchView; 
static String am; 
private MenuItem menua; 
public static ArrayList<ClientTask> newList; 
RecyclerView.LayoutManager layoutManager; 
public BackgroundAsync backgroundAsync; 
private ArrayList<ClientTask> clienttask = new ArrayList<>(); 
ClientRecycler recycler; 

private ListView mListView; 

Button opencon; 
// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 

// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 

private OnFragmentInteractionListener mListener; 

public ClientFragment() { 
    // Required empty public constructor 
} 
public static ClientFragment newInstance(String param1, String param2) { 
    ClientFragment fragment = new ClientFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onPrepareOptionsMenu(Menu menu){ 


    am="asdf"; 
    MenuItem menuItem = menu.findItem(R.id.mysearchbtn); 
    SearchView searchView = (SearchView) menuItem.getActionView(); 
    searchView.setOnQueryTextListener(this); 
    Log.d(TAG, "onCreateFragment "); 
    super.onPrepareOptionsMenu(menu); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
    if (getArguments() != null) { 
     setRetainInstance(true); 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 

} 




@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 

    View view = inflater.inflate(R.layout.fragment_client, container, false); 

    progressBar = view.findViewById(R.id.progressbar); 
    recyclerView = view.findViewById(R.id.recyclerView); 
    layoutManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setHasFixedSize(true); 


    recycler = new ClientRecycler(clienttask); 

    opencon = view.findViewById(R.id.opencon); 
    opencon.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(getActivity(), AddClient.class); 
      startActivity(intent); 
     } 
    }); 

    return view; 
} 

// TODO: Rename method, update argument and hook method into UI event 
public void onButtonPressed(Uri uri) { 
    if (mListener != null) { 
     mListener.onFragmentInteraction(uri); 
    } 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof OnFragmentInteractionListener) { 
     mListener = (OnFragmentInteractionListener) context; 
    } else { 
    // Toast.makeText(context, " Off", Toast.LENGTH_SHORT).show(); 

    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mListener = null; 
} 

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

@Override 
public boolean onQueryTextChange(String newText) { 
    newText = newText.toLowerCase(); 
    newList = new ArrayList<>(); 
     for (ClientTask clientTask : clienttask) { 
      String name = clientTask.get_clienttaskname().toLowerCase(); 
      if (name.contains(newText)) { 
       Log.d(TAG, "u get any: "+ name); 
       newList.add(clientTask); 
      }else{ 
       Log.d(TAG, "we aint got shit: "+ name); 
      } 

     } 

     Log.d(TAG, "the usual fail "); 
    recyclerView.setAdapter(recycler); 
    return true; 
} 

void filter(String text){ 
    ArrayList<ClientTask> newList = new ArrayList(); 

     for (ClientTask c : clienttask) { 
    // String name = clientTask.get_clienttaskname().toLowerCase(); 
     if (c.get_clienttaskname().contains(text)) { 
      newList.add(c); 
     } 

      Log.d(TAG, "the usual fail "); 
      BackgroundAsync.setFilter(newList); 
      recyclerView.setAdapter(recycler); 
    } 
} 


public interface OnFragmentInteractionListener { 
    // TODO: Update argument type and name 
    void onFragmentInteraction(Uri uri); 
} 
@Override 
public void onResume() { 
    super.onResume(); 
    new BackgroundAsync(recyclerView,progressBar,getActivity(),newList).execute(); 
} 


} 

일부 부품이 매우 불필요한있을 수 있습니다에 대한

내 문제를 해결하기 위해 노력했지만 너무 많은 수정 작업을 시도했는데 결과적으로 이상하게 보이는 구현 방법이 있습니다. tations. 죄송합니다 문제와 다시, 도움을 주셔서 감사합니다.

+0

[Filter this'] (https://gist.github.com/Shywim/127f207e7248fe48400b) 일반적인'Filterable' 어댑터를 기본 클래스로 사용하고'FilterQueryProvider'를 설정합니다 - 필터링은 평소와 같이 끝납니다 :'adapter.getFilter() .filter (....)' – pskink

+0

왜 AsyncTask가 뷰를 보유하고 있는지 더 나은 코드를 작성하는 것을 고려해야합니까? 당신은 당신의 AsyncTask와 뷰 사이의 통신을위한 인터페이스를 가져야한다.이 대답을 확인해 보라. https://stackoverflow.com/questions/9963691/android-asynctask-sending-callbacks-to-ui – tamtom

+0

@pskink 답장을 보내 주셔서 감사합니다. 정말 고맙겠지 만, 기본적으로 내 코드를 변경하고 문제가 무엇인지 알지 못할뿐만 아니라 내가 뭘 잘못하고 있는지도 알지 못합니다. 나는 정말 안드로이드 개발에 익숙하다. 그래서 어떤 설명도 인정 될 것이다. –

답변

0

비동기 작업 클래스를 Fragment 클래스로 이동하여 문제를 해결할 수 있으므로 동일한 변수를 공유합니다. 생성자의 모든 입력을 지워서 새 BackgroundBsync().execute();이되었습니다. 그것을 해결하고 이제는 Rafadapter 클래스에서 만든 별도의 메서드로 모든 데이터를 검색 할 수있게되었습니다. 코드는 아래와 같습니다.

public void setFilter(ArrayList<ClientTask> newList){ 
     clientTasks = new ArrayList<>(); 
     clientTasks.addAll(newList); 
     notifyDataSetChanged(); 
    } 

그래서 모든 나는 onQueryTextChange 코드

newText = newText.toLowerCase(); 
     ArrayList<ClientTask> newList = new ArrayList(); 

     for (ClientTask c : clienttask) { 
       String name = c.get_clienttaskname().toLowerCase(); 
      if (name.contains(newText)) { 
       newList.add(c); 
      } 

      Log.d(TAG, "the usual fail "); 
     } 
     recycler.setFilter(newList); 
     return true; 

의 몇 줄을 추가하는 것이었다 내에서 추가하는 데 필요한 그리고 그것은 내 문제를 해결했다. RafAdapter는 ClientRecycler와 같습니다.

관련 문제