0

我正在制作一个将 JSON 数据解析为列表视图的应用程序。我还想在工具栏中添加一个搜索对话框。但我不知道如何实现这一点。我已经检查了Android Developer 文档,但我仍然卡住了。因此,任何想法,任何建议都会有所帮助。

这是我的 MainActivity.java

public class MainActivity extends AppCompatActivity implements LoaderCallbacks<List<PlayerDetails>> {

public static final String LOG_TAG = MainActivity.class.getName();

private static final int PLAYER_ID = 1;

private static final String PLAYER_DETAILS_URL =
        "http://hackerearth.0x10.info/api/gyanmatrix?type=json&query=list_player";

private ListView playerListView;
private PlayerAdapter mAdapter;
private ProgressBar mProgressBar;
private TextView mPlayerTextView;
MaterialSearchView searchView;


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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setTitle(R.string.app_name);
    toolbar.setTitleTextColor(Color.parseColor("#FFFFFF"));

    searchView = (MaterialSearchView) findViewById(R.id.search_view);

    mAdapter = new PlayerAdapter(this, new ArrayList<PlayerDetails>());

    playerListView = (ListView) findViewById(R.id.list);

    mPlayerTextView = (TextView) findViewById(R.id.empty_text_view);

    playerListView.setAdapter(mAdapter);

    searchView.setOnSearchViewListener(new MaterialSearchView.SearchViewListener() {
        @Override
        public void onSearchViewShown() {
        }

        @Override
        public void onSearchViewClosed() {
            mAdapter = new PlayerAdapter(MainActivity.this, new ArrayList<PlayerDetails>());
            playerListView.setAdapter(mAdapter);
        }
    });

    playerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            PlayerDetails player = mAdapter.getItem(position);

            String playerImage = player.getImage();
            String playerName = player.getName();
            String playerCountry = player.getCountry();
            String playerDesc = player.getDesc();
            String playerRuns = player.getTotalScore();
            String playerMatches = player.getMatchesPlayed();

            Intent intent = new Intent(MainActivity.this, PlayerDetailsActivity.class);
            intent.putExtra("playerImage", playerImage);
            intent.putExtra("playerName", playerName);
            intent.putExtra("playerCountry", playerCountry);
            intent.putExtra("playerDesc", playerDesc);
            intent.putExtra("playerRuns", playerRuns);
            intent.putExtra("playerMatches", playerMatches);

            startActivity(intent);
        }
    });

    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();

    if (networkInfo != null && networkInfo.isConnected()) {
        getLoaderManager().initLoader(PLAYER_ID, null, this).forceLoad();
    } else {
        mProgressBar = (ProgressBar) findViewById(R.id.loading_spinner);
        mProgressBar.setVisibility(View.INVISIBLE);
    }
}



@Override
public Loader<List<PlayerDetails>> onCreateLoader(int id, Bundle args) {

    Uri baseUri = Uri.parse(PLAYER_DETAILS_URL);
    Uri.Builder uriBuilder = baseUri.buildUpon();

    return new PlayerLoader(this, uriBuilder.toString());
}

@Override
public void onLoadFinished(Loader<List<PlayerDetails>> loader, List<PlayerDetails> data) {
    Log.v("MainActivity", "The UI is created via onLoadFinished");

    mProgressBar = (ProgressBar) findViewById(R.id.loading_spinner);
    mProgressBar.setVisibility(View.GONE);

    mPlayerTextView = (TextView) findViewById(R.id.empty_text_view);
    mPlayerTextView.setVisibility(View.GONE);
    // Clear the adapter of previous earthquake data
    mAdapter.clear();

    // If there is a valid list of {@link Earthquake}s, then add them to the adapter's
    // data set. This will trigger the ListView to update.
    if (data != null && !data.isEmpty()) {
        mAdapter.addAll(data);
    }
}

@Override
public void onLoaderReset(Loader<List<PlayerDetails>> loader) {
    Log.v("MainActivity", "The data is destroyed and the Loader is reset via onLoadReset()");
    //Loader reset, so we can clear out all the existing data
    mAdapter.clear();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu_search, menu);
    MenuItem searchItem = menu.findItem(R.id.search);
    searchView.setMenuItem(searchItem);
    return true;
}

}

我的 Adapter.java 类是

public class PlayerAdapter extends ArrayAdapter<PlayerDetails> {

public PlayerAdapter(Activity context, ArrayList<PlayerDetails> players) {
    super(context, 0, players);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    View listItemView = convertView;
    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.list_item, parent, false);
    }
    PlayerDetails currentPlayer = getItem(position);

    ImageView playerImageView = (ImageView) listItemView.findViewById(R.id.player_image_view);

    Glide.with(getContext()).load(currentPlayer.getImage())
            .crossFade()
            .thumbnail(0.5f)
            .bitmapTransform(new CircleTransform(getContext()))
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(playerImageView);

    TextView playerNameTextView = (TextView) listItemView.findViewById(R.id.player_name_text_view);
    playerNameTextView.setText(currentPlayer.getName());

    TextView playerCountryTextView = (TextView) listItemView.findViewById(R.id.player_country);
    playerCountryTextView.setText(currentPlayer.getCountry());

    return listItemView;
}

}

4

2 回答 2

0

在活动栏中添加菜单项搜索使其膨胀,然后在您的活动中

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        MenuItem searchMenuItem = menu.findItem(R.id.action_search);
        if (searchMenuItem == null) {
            return;
        }
        SearchView searchView = (SearchView) searchMenuItem.getActionView();
        searchView.setOnQueryTextListener(mSearchQueryTextListener);
    }

 protected SearchView.OnQueryTextListener mSearchQueryTextListener
        = new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String s) {
        onSearchTextChanged(s);
        return false;
    }
};

现在在 onSearchTextChanged 中使用 contains 关键字 Arraylist.contains(s) 搜索列表中的字符串并重新加载列表

希望能帮助到你

于 2017-03-16T14:30:15.560 回答
0

您必须创建以在适配器中实现getFilter()并创建一个Filter类,该类将根据搜索条件进行过滤。这是一个例子:https ://gist.github.com/tobiasschuerg/3554252

于 2017-03-16T14:35:54.870 回答