2017-12-09 1 views
0

Ich habe versucht, eine SearchView in meiner actionBar zu implementieren, die eine recyclerview filtert, die ihre Daten seit Tagen von einer Async-Aufgabe bezieht und ich kann es nicht zum Laufen bringen .Suche in einem RecyclerView, der seine Daten von einer asynchronen Aufgabe bezieht

Auf alle Antworten, die ich hier gesehen habe, bekommt Der Adapter für die Recycler-Klasse ist in der gleichen Klasse wie der SearchView. aber in meiner App ist der Adapter in der Async-Klasse, während die Searchview in einem Fragment ist. Ich habe eine Async-Klasse erstellt, weil ich nicht möchte, dass mein UI-Thread langsamer wird oder abstürzt, wenn meine App versucht, die Elemente auf dem RecyclerView zu laden. Nach unten sind meine Codes, jede Hilfe wäre schön.

und schließlich für mein Fragment, ich habe ein paar Codes so krank nur schneiden die meisten von ihnen aus und lassen was relevant für die Frage. Vielen Dank.

für 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(); 
} 
} 

Und für die 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(); 
} 
} 

Und schließlich meine 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(); 
} 


} 

Einige Teile meines Code kann ganz unecessary sein um mein Problem zu lösen, aber ich habe so viele Korrekturen ausprobiert, die nicht funktionierten, und als Ergebnis habe ich einige komisch aussehende Implemenmen Für die Mühe und wieder, danke für die Hilfe.

+0

Verwenden Sie [this] (https://gist.github.com/Shywim/127f207e7248fe48400b) generische 'Filterable' Adapter als Basisklasse und richten Sie ihren' FilterQueryProvider' ein - die Filterung erfolgt wie gewohnt: 'adapter.getFilter() .filter (....) ' – pskink

+0

sollten Sie einen besseren Code schreiben, warum' AsyncTask 'die Ansichten hält? Sie sollten eine Schnittstelle haben, um zwischen Ihrer 'AsyncTask' und den Ansichten zu kommunizieren, überprüfen Sie bitte diese Antwort https://stackoverflow.com/questions/9963691/android-asynctask-sending-callbacks-to-ui – tamtom

+0

@pskink Danke für die Antwort, Ich schätze es sehr, aber ich werde meinen Code grundlegend ändern und werde nicht wissen, was das Problem ist, und ich würde auch nicht erfahren, was ich falsch mache. Ich bin neu in der Android-Entwicklung, also möchte ich auch lernen, damit jede Erklärung geschätzt wird. –

Antwort

0

Ich habe es geschafft, das Problem zu lösen, indem ich die Async-Task-Klasse in die Fragment-Klasse verschiebe, also teilen sie die gleichen Variablen. Ich habe alle Eingaben im Konstruktor gelöscht, so dass es neu wurde BackgroundBsync().execute();. Das hat es gelöst und ich bin jetzt in der Lage, alle Daten mit einer separaten Methode zu durchsuchen, die ich in der Rafadapter-Klasse gemacht habe. Die Codes sind unten.

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

so brauchte ich nicht in hinzufügen meine onQueryTextChange war ein paar Zeilen Code

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; 

Und es mein Problem gelöst hinzuzufügen. Bitte beachten Sie, dass RafAdapter dem ClientRecycler entspricht.

Verwandte Themen