【问题标题】:Android - SearchView filtering a JSON in Assets folder displayed in a RecyclerViewAndroid - SearchView 过滤 RecyclerView 中显示的 Assets 文件夹中的 JSON
【发布时间】:2022-08-23 11:59:14
【问题描述】:

我需要帮助来弄清楚如何通过放置在 assets 文件夹中的 JSON 文件过滤搜索结果,并将其显示在 RecyclerView 中。 我以前通过使用上传到 Firebase 的 JSON 成功实现了它,但是由于我将它移到了本地资产中,所以我迷路了。我知道我应该使用其他一些过滤类,但任何尝试似乎都失败了。 到目前为止,这是我的代码:

适配器

public class AdapterJSON extends RecyclerView.Adapter<AdapterJSON.MyViewHolderJSON> {

    Context contextJSON;
    ArrayList<String> lang1;
    ArrayList<String> lang2;

    public AdapterJSON(Context contextJSON, ArrayList<String> lang1, ArrayList<String> lang2) {
        this.contextJSON = contextJSON;
        this.lang1 = lang1;
        this.lang2 = lang2;
    }

    @NonNull
    @Override
    public MyViewHolderJSON onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View vJSON = LayoutInflater.from(contextJSON).inflate(R.layout.sections_row, parent, false);
        return new MyViewHolderJSON(vJSON);
    }

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

        holder.italian.setText(lang1.get(position));
        holder.indonesian.setText(lang2.get(position));

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(contextJSON, \"Yo\", Toast.LENGTH_SHORT).show();
            }
        });
    }

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

    public class MyViewHolderJSON extends RecyclerView.ViewHolder {

        TextView italian, indonesian;

        public MyViewHolderJSON(@NonNull View itemView) {
            super(itemView);

            italian = itemView.findViewById(R.id.tvfirstName);
            indonesian = itemView.findViewById(R.id.tvlastName);
        }
    }
}

搜索活动类

public class SearchActivityJSON extends AppCompatActivity {

    RecyclerView recyclerView;
    AdapterJSON mainAdapter;
    Button button_logout;
    ArrayList<String> lang1 = new ArrayList<>();
    ArrayList<String> lang2 = new ArrayList<>();

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

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        Objects.requireNonNull(getSupportActionBar()).setTitle(\"\");


        recyclerView = findViewById(R.id.recyclerviewId);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);

        button_logout = findViewById(R.id.button_logout);

        button_logout.setOnClickListener(view -> {
            Intent intent = new Intent(SearchActivityJSON.this, HomeActivity.class);
            startActivity(intent);
        });

    }
@Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_item, menu);
        MenuItem item = menu.findItem(R.id.searchId);
        SearchView searchView = (SearchView) item.getActionView();

        searchView.setIconifiedByDefault(true);
        searchView.setFocusable(true);
        searchView.setIconified(false);
        searchView.requestFocusFromTouch();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

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

            @Override
            public boolean onQueryTextChange(String newText) {
                mysearch(newText);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }
    private void mysearch(String newText) {

        String jsonString = loadJSONfromAssets();

        if (newText.isEmpty()) {
            Toast.makeText(this, \"There is nothing\", Toast.LENGTH_SHORT).show();


    } else {

            try {
                assert jsonString != null;
                JSONObject json = new JSONObject(jsonString);
                JSONArray m_Array = json.getJSONArray(\"CommonWords\");
                for (int i = 0; i < m_Array.length(); i++) {

                    JSONObject inside = m_Array.getJSONObject(i);
                    lang1.add(inside.getString(\"italian\"));
                    lang2.add(inside.getString(\"indonesian\"));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            mainAdapter = new AdapterJSON(this, lang1, lang2);
            recyclerView.setAdapter(mainAdapter);
            Toast.makeText(this, \"There is something\", Toast.LENGTH_SHORT).show();
 }
    }

private String loadJSONfromAssets() {
        String json;
        try {
            InputStream is = getAssets().open(\"assetPhrasebook.json\");
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();

            json = new String (buffer, StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return json;
    }
}

文件

{
    \"Kosong\": [
        {
            \"italian\": \"\",
            \"indonesian\": \"\",
        }
    ],
    \"CommonWords\": [
        {
            \"italian\": \"Si\",
            \"indonesian\": \"Ya\",
        },
        {
            \"italian\": \"No\",
            \"indonesian\": \"Tidak\",
        },
        {
            \"italian\": \"Forse\",
            \"indonesian\": \"Mungkin\",
        },
        {
            \"italian\": \"Grazie\",
            \"indonesian\": \"Terima kasih\",
        },
        {
            \"italian\": \"Prego\",
            \"indonesian\": \"Sama sama\",
        }
 ]
}

感谢任何可以帮助我的人。

    标签: android json android-recyclerview assets searchview


    【解决方案1】:

    我自己得到了它,如果有人需要,我会分享解决方案:

    适配器

    public class AdapterSearchJSON extends RecyclerView.Adapter<AdapterSearchJSON.myViewHolderSearchJSON> {
    
    Context context;
    ArrayList<String> lang1;
    ArrayList<String> lang2;
    
    public AdapterSearchJSON(Context context, ArrayList<String> lang1, ArrayList<String> lang2) {
    
        this.context = context;
        this.lang1 = lang1;
        this.lang2 = lang2;
    }
    
    public void updateData(ArrayList<String> lang1, ArrayList<String> lang2){
        this.lang1 = lang1;
        this.lang2 = lang2;
        notifyDataSetChanged();
    }
    
    @NonNull
    @Override
    public myViewHolderSearchJSON onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
        View vJSON = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_results_row, parent, false);
        return new myViewHolderSearchJSON(vJSON);
    }
    
    @Override
    public void onBindViewHolder(@NonNull myViewHolderSearchJSON holder, int position) {
    
        holder.italian.setText(lang1.get(position));
        holder.indonesian.setText(lang2.get(position));
    }
    
    @Override
    public int getItemCount() {
        return lang1.size();
    }
    
    public class myViewHolderSearchJSON extends RecyclerView.ViewHolder {
        TextView italian, indonesian;
    
        public myViewHolderSearchJSON(@NonNull View itemView) {
            super(itemView);
    
            italian = itemView.findViewById(R.id.firstLanguage);
            indonesian = itemView.findViewById(R.id.italian);
        }
    
    }}
    

    搜索活动

    public class SearchActivityJSON extends AppCompatActivity {
    
    RecyclerView recyclerView;
    AdapterSearchJSON adapterSearchJSON;
    Button button_logout;
    ArrayList<String> lang1;
    ArrayList<String> lang2;
    
    String searchStr = "";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_search);
    
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        Objects.requireNonNull(getSupportActionBar()).setTitle("");
    
        lang1 = new ArrayList<>();
        lang2 = new ArrayList<>();
    
        recyclerView = findViewById(R.id.recyclerviewId);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);
    
        adapterSearchJSON = new AdapterSearchJSON(this, lang1, lang2);
        recyclerView.setAdapter(adapterSearchJSON);
    
        button_logout = findViewById(R.id.button_logout);
    
        addItemFromJSON();
    
        final Handler handler = new Handler(Looper.getMainLooper());
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //Do something after 100ms
                searchStr = "";
                addItemFromJSON();
                adapterSearchJSON.updateData(lang1,lang2);
    
            }
        }, 100);
    
        //intent back button
        button_logout.setOnClickListener(view -> {
            Intent intent = new Intent(SearchActivityJSON.this, HomeActivity.class);
            startActivity(intent);
        });
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    
        getMenuInflater().inflate(R.menu.menu_item, menu);
        MenuItem item = menu.findItem(R.id.searchId);
        SearchView searchView = (SearchView) item.getActionView();
    
        searchView.setIconifiedByDefault(true);
        searchView.setFocusable(true);
        searchView.setIconified(false);
        searchView.requestFocusFromTouch();
    
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    
            @Override
            public boolean onQueryTextSubmit(String newText) {
                return false;
            }
    
            @Override
            public boolean onQueryTextChange(String newText) {
    
                searchStr = newText;
                addItemFromJSON();
                adapterSearchJSON.updateData(lang1,lang2);
    
                return true;
            }
        });
        return true;
    }
    
    private String loadJSONfromAssets() {
        String json;
        try {
            InputStream is = getAssets().open("assetPhrasebook.json");
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
    
            json = new String (buffer, StandardCharsets.UTF_8);
    
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return json;
    }
    
    private void addItemFromJSON() {
    
        ArrayList<String> lang1t = new ArrayList<>();
        ArrayList<String> lang2t = new ArrayList<>();
    
        try {
    
            String name = "";
    
            String jsonString = loadJSONfromAssets();
    
            assert jsonString != null;
            JSONObject json = new JSONObject(jsonString);
            JSONArray m_Array = json.getJSONArray("CommonWords");
            for (int i = 0; i < m_Array.length(); i++) {
                JSONObject inside = m_Array.getJSONObject(i);
                if (inside.getString("italian").trim().toLowerCase().contains(searchStr.trim().toLowerCase()))
                {
                    lang1t.add(inside.getString("italian"));
                    lang2t.add(inside.getString("indonesian"));
                }
            }         
    
            this.lang1 = lang1t;
            this.lang2 = lang2t;
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }}
    

    使用安全!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2017-03-08
      相关资源
      最近更新 更多