首页 > 解决方案 > 如何使用 json 对象在回收站视图中添加搜索?

问题描述

我想在 recyclerview 中为我的 jsonobject 数组创建一个过滤器搜索功能

我在我的适配器中尝试了 getfilter 并将其传递给我的 add_detail 但是当我在我的 app_detail 活动中键入文本时它让我强制关闭

这是我的 app_detail.java :

public class app_detail extends AppCompatActivity implements PemrogramanAdapter.OnItemClickListener {


TextView nametxt;
ImageView imageView,listimageview;
private RecyclerView mRecyclerView;
private List<Object> mRecyclerViewItems = new ArrayList<>();

private SearchView searchView;
PemrogramanAdapter pemrogramanAdapters;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_app_detail);

    nametxt = (TextView) findViewById(R.id.list_app_text_detail);
    imageView = (ImageView) findViewById(R.id.list_app_image_detail);


    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
    getSupportActionBar().setTitle("test");

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view1);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

    PemrogramanAdapter pemrogramanAdapter = new PemrogramanAdapter(this,mRecyclerViewItems);
    mRecyclerView.setAdapter(pemrogramanAdapter);

    pemrogramanAdapter.setmListener(app_detail.this);

    tambahMenuItemDariJson();
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu,menu);
    SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView)menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setMaxWidth(Integer.MAX_VALUE);

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            pemrogramanAdapters.getFilter().filter(s);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            pemrogramanAdapters.getFilter().filter(s);
            return false;
        }
    });

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();
    if(id == R.id.action_search)
        return true;

    if(id == android.R.id.home)
        this.finish();

    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    if(!searchView.isIconified())
    {
        searchView.setIconified(true);
        return;
    }
    super.onBackPressed();
    Animatoo.animateZoom(app_detail.this);
}


private void tambahMenuItemDariJson() {
    try{
        String jsonDataString = readJsonDataDariFile();
        JSONArray menuItemsJsonArray = new JSONArray(jsonDataString);

        for(int i = 0; i<menuItemsJsonArray.length(); ++i){
            JSONObject menuItemObject =menuItemsJsonArray.getJSONObject(i);
            String txt_id_app = menuItemObject.getString("id_app");
            String txt_title = menuItemObject.getString("masalah");
            String txt_id = menuItemObject.getString("id");
            String txt_keterangan = menuItemObject.getString("ket");
            String txt_langkah = menuItemObject.getString("langkah");

            item item = new item(txt_id_app,txt_id,txt_title,txt_keterangan,txt_langkah);
            mRecyclerViewItems.add(item);
        }
    } catch (IOException | JSONException exception){
        Log.e(guidesoftware.class.getName(),"Tidak BISA BUKA FILE JSON!",exception);
    }
}

private String readJsonDataDariFile() throws  IOException {
    InputStream inputStream = null;
    StringBuilder builder = new StringBuilder();

    //menentukan konten
    Intent intent = this.getIntent();
    int position = intent.getExtras().getInt("POS_KEY");
    int jsonlocation = 0;
    //kondisi per lokasi
    if(position == 0){
        jsonlocation = R.raw.pemrograman_octave;
    }else if(position == 1){
        jsonlocation = R.raw.pemrograman_netbeans;
    }else if(position == 2){
        jsonlocation = R.raw.pemrograman_devcpp;
    }else if(position == 3){
        jsonlocation = R.raw.pemrograman_notepad;
    }
    try {
        String jsonDataString = null;
        inputStream = getResources().openRawResource(jsonlocation);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
        while ((jsonDataString = bufferedReader.readLine()) != null){
            builder.append(jsonDataString);
        }
    }finally {
        if(inputStream != null){
            inputStream.close();
        }
    }
    return new String(builder);
}

@Override
public void onItemSelected(int position) {
    Intent detailIntent = new Intent(this,fortest.class);
    item clickeditem = (item) mRecyclerViewItems.get(position);

    detailIntent.putExtra(EXTRA_MASALAH,clickeditem.getMasalah());
    detailIntent.putExtra(EXTRA_KETERANGAN,clickeditem.getKet());
    detailIntent.putExtra(EXTRA_LANGKAH,clickeditem.getLangkah());
    startActivity(detailIntent);
    }}

这是我的 pemrogramanAdapter.java :

public class PemrogramanAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable{

private static final int MENU_ITEM_VIEW_TYPE = 0;
private final Context context;
private final List<Object> recyclerViewItem;
private List<Object> filterrecyclerViewItem;
private OnItemClickListener mListener;

public PemrogramanAdapter(Context context, List<Object> recyclerViewItem) {
    this.context = context;
    this.recyclerViewItem = recyclerViewItem;
    this.filterrecyclerViewItem = recyclerViewItem;
}


public void setmListener(OnItemClickListener mListener) {
    this.mListener = mListener;
}

public class MenuItemViewHolder extends RecyclerView.ViewHolder{
public TextView txt_title,txt_keterangan;
public ImageView txt_image;

   public MenuItemViewHolder(View view){
    super(view);
    txt_title = (TextView)view.findViewById(R.id.title);
    txt_keterangan = (TextView)view.findViewById(R.id.isi);
    txt_image = (ImageView)view.findViewById(R.id.avatar);

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mListener != null){
                int position = getAdapterPosition();
                if(position != RecyclerView.NO_POSITION){
                    mListener.onItemSelected(position);
                }
            }
        }
    });
}
}

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

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    switch (i){
        case MENU_ITEM_VIEW_TYPE:

        default:
            View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout,viewGroup,false);
            return new MenuItemViewHolder(menuItemLayoutView);
    }
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    int viewType = getItemViewType(position);
    switch (viewType){
        case MENU_ITEM_VIEW_TYPE:
        default:
            MenuItemViewHolder menuItemViewHolder = (MenuItemViewHolder) holder;
            item menuItem = (item) recyclerViewItem.get(position);
            menuItemViewHolder.txt_title.setText(menuItem.getMasalah());
            menuItemViewHolder.txt_keterangan.setText(menuItem.getKet());
            menuItemViewHolder.txt_image.setImageResource(R.drawable.pemrog_netbeans);
    }

}

public interface OnItemClickListener{
    void onItemSelected (int position);
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String searchString = charSequence.toString();
            if(searchString.isEmpty())
                filterrecyclerViewItem = recyclerViewItem; //for se kembalikan item yg di search ke semula
            else{
                List<Object> resultList = new ArrayList<>();
                for(Object data : recyclerViewItem)
                {
                    item item = new item();
                    if(item.getMasalah().toLowerCase().contains(searchString.toLowerCase() ))
                        resultList.add(item);
                }

                filterrecyclerViewItem = resultList;
            }
            FilterResults filterResults =  new FilterResults();
            filterResults.values = filterResults;
            return filterResults;
        }
        @Override
        protected void publishResults(CharSequence constraint, FilterResults filterResults) {
            filterrecyclerViewItem  = (ArrayList<Object>)filterResults.values;
            notifyDataSetChanged();
        }
    };
}
}

我想让过滤器搜索在 app_detail.java 中的我的 jsonObject 上工作

标签: android

解决方案


推荐阅读