错误:OnEditorActionListener()无法正常工作(尝试了所有我能找到的解决方案)

时间:2019-03-26 17:11:48

标签: android xml retrofit

因此,当我单击键盘上的Enter按钮时,它应该从弹性搜索服务器返回我所有的数据,但是当我单击按钮时,什么也没有发生。我认为OnEditorActionListener()无法正常工作,并且日志中也没有显示日志。我在其他问题上尝试了所有解决方案,但它要么将我的输入按钮更改为搜索按钮,要么什么都不做。谁能告诉我代码中有什么问题以及如何解决。

这是整个代码

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;  
import android.widget.Toast;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import ankittx.com.forsale.models.HitsList;
import ankittx.com.forsale.models.HitsObject;
import ankittx.com.forsale.models.Post;
import ankittx.com.forsale.util.ElasticSearchAPI;
import ankittx.com.forsale.util.PostListAdapter;
import okhttp3.Credentials;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class SearchFragment extends Fragment {

private static final String TAG = "SearchFragment";
private static final String BASE_URL = "http://35.184.51.77//elasticsearch/posts/post/";

//widgets
private ImageView mFilters;
private EditText mSearchText;

//vars
private String mElasticSearchPassword;
private String mPrefCity;
private String mPrefStateProv;
private String mPrefCountry;
private ArrayList<Post> mPosts;
private String searchString = " ";


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_search, container, false);
    mFilters = (ImageView) view.findViewById(R.id.ic_search);
    mSearchText = (EditText) view.findViewById(R.id.input_search);

    init();
    getElasticSearchPassword();

    return view;
}

private void init(){
    mFilters.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "onClick: navigating to filters activity.");
            Intent intent = new Intent(getActivity(), FiltersActivity.class);
            startActivity(intent);
        }
    });

    mSearchText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

            Log.d(TAG, "onEditorAction: onEditorAction is working ");
            if(actionId == EditorInfo.IME_ACTION_SEARCH
                    ||actionId == EditorInfo.IME_ACTION_DONE
                    || event.getAction() == KeyEvent.ACTION_DOWN
                    || event.getKeyCode() == KeyEvent.KEYCODE_ENTER){

                mPosts = new ArrayList<Post>();

                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

                ElasticSearchAPI searchAPI = retrofit.create(ElasticSearchAPI.class);

                HashMap<String, String> headerMap = new HashMap<String, String>();
                headerMap.put("Authorization", Credentials.basic("user", mElasticSearchPassword));

                if(!mSearchText.equals("")){
                    searchString = searchString + mSearchText.getText().toString() + "*";
                }
                if(!mPrefCity.equals("")){
                    searchString = searchString + " city:" + mPrefCity;
                }
                if(!mPrefStateProv.equals("")){
                    searchString = searchString + " state_province:" + mPrefStateProv;
                }
                if(!mPrefCountry.equals("")){
                    searchString = searchString + " country:" + mPrefCountry;
                }

                Call<HitsObject> call = searchAPI.search(headerMap, "AND", searchString);

                call.enqueue(new Callback<HitsObject>() {
                    @Override
                    public void onResponse(Call<HitsObject> call, Response<HitsObject> response) {

                        HitsList hitsList = new HitsList();
                        String jsonResponse = "";

                        try{
                            Log.d(TAG, "onResponse: server response: " + response.toString());

                            if(response.isSuccessful()){
                                hitsList = response.body().getHits();
                            }else{
                                jsonResponse = response.errorBody().string();
                            }

                            Log.d(TAG, "onResponse: hits: " + hitsList);

                            for(int i = 0; i < hitsList.getPostIndex().size(); i++){
                                Log.d(TAG, "onResponse: data: " + hitsList.getPostIndex().get(i).getPost().toString());
                                mPosts.add(hitsList.getPostIndex().get(i).getPost());
                            }

                            Log.d(TAG, "onResponse: size: " + mPosts.size());
                            //setup the list of posts

                        }catch (NullPointerException e){
                            Log.e(TAG, "onResponse: NullPointerException: " + e.getMessage() );
                        }
                        catch (IndexOutOfBoundsException e){
                            Log.e(TAG, "onResponse: IndexOutOfBoundsException: " + e.getMessage() );
                        }
                        catch (IOException e){
                            Log.e(TAG, "onResponse: IOException: " + e.getMessage() );
                        }
                    }

                    @Override
                    public void onFailure(Call<HitsObject> call, Throwable t) {
                        Log.e(TAG, "onFailure: " + t.getMessage() );
                        Toast.makeText(getActivity(), "search failed", Toast.LENGTH_SHORT).show();
                    }
                });
            }

            return false;
        }
    });
}

@Override
public void onResume() {
    super.onResume();
    getFilters();
}

private void getElasticSearchPassword(){
    Log.d(TAG, "getElasticSearchPassword: retrieving elasticsearch password.");

    Query query = FirebaseDatabase.getInstance().getReference()
            .child(getString(R.string.node_elasticsearch))
            .orderByValue();

    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            DataSnapshot singleSnapshot = dataSnapshot.getChildren().iterator().next();
            mElasticSearchPassword = singleSnapshot.getValue().toString();

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

private void getFilters(){
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    mPrefCity = preferences.getString(getString(R.string.preferences_city), "");
    mPrefStateProv = preferences.getString(getString(R.string.preferences_state_province), "");
    mPrefCountry = preferences.getString(getString(R.string.preferences_country), "");

    Log.d(TAG, "getFilters: got filters: \ncity: " + mPrefCity + "\nState/Prov: " + mPrefStateProv
            + "\nCountry: " + mPrefCountry);
}

}

XML代码=

  <RelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   xmlns:app="http://schemas.android.com/apk/res-auto">

   <android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:id="@+id/search_toolbar"
    android:background="@drawable/grey_border_bottom"
    android:padding="2dp"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@null"
            android:hint="search..."
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:textSize="14sp"
            android:layout_toLeftOf="@+id/ic_search"
            android:id="@+id/input_search"/>

        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:id="@+id/ic_search"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:src="@drawable/ic_search"
            android:layout_marginRight="5dp"/>


    </RelativeLayout>

</android.support.v7.widget.Toolbar>


<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/recyclerView"
    android:scrollbars="vertical"
    android:layout_below="@+id/search_toolbar"
    android:background="@color/lightGrey">


</android.support.v7.widget.RecyclerView>


<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container"
    android:visibility="gone">

</FrameLayout>


</RelativeLayout>

0 个答案:

没有答案