【问题标题】:Search a RecyclerView that gets its data from an async Task搜索从异步任务中获取数据的 RecyclerView
【发布时间】:2017-12-09 19:22:53
【问题描述】:

我一直在尝试在我的 actionBar 中实现一个 SearchView 来过滤从异步任务中获取数据的回收视图,但我似乎无法让它工作。

在我在这里看到的所有答案中,回收器类的适配器与 SearchView 在同一个类上。但在我的应用程序中,适配器位于 Async 类中,而 Searchview 位于片段中。我创建了一个 Async 类,因为我不希望我的 UI 线程在我的应用程序尝试加载 RecyclerView 上的项目时减慢或崩溃。下面是我的代码,任何帮助都会很可爱。

最后,对于我的片段,我有一些代码,所以我只是将它们中的大部分删掉并留下与问题相关的内容。谢谢。

对于 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();
}


}

我的代码的某些部分可能无法解决我的问题,但我尝试了很多不起作用的修复程序,结果,我有一些看起来很奇怪的实现。抱歉给您带来麻烦,再次感谢寻求帮助。

【问题讨论】:

  • 使用this generic Filterable 适配器作为基类并设置它的FilterQueryProvider - 过滤照常完成:adapter.getFilter().filter(....)
  • 您应该考虑编写更好的代码,为什么AsyncTask 持有观点?您应该有一个界面可以在您的AsyncTask 和视图之间进行通信,请查看此答案stackoverflow.com/questions/9963691/…
  • @pskink 感谢您的回复,我真的很感激,但我基本上会更改我的代码并且不会知道问题是什么,我也不会知道我在做什么错误的。我是 Android 开发新手,所以我真的很想学习,所以任何解释都将不胜感激。
  • @tamtom 我对异步任务的了解不是很好,所以这就是我知道如何实现异步任务的方式。我会研究一下接口,看看我能用它做什么。感谢您的帮助
  • @pskink 好的,我会这样做的。但这是否意味着我的代码无法修复?

标签: java android android-fragments asynchronous


【解决方案1】:

我设法通过将 Async 任务类移动到 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 相同。

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 2015-12-04
    • 2022-08-17
    • 2016-01-21
    • 2013-12-27
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多