Android: 列表未传递给 RecyclerView

Android: List not pass to RecyclerView

我正在将 MainActivity.class 中的值传递给此片段 ResultFrag.class。在这个 class 中,它应该显示用户当前位置在请求值范围内的地点。

json return 正确。

我也试过调试显示myList到Logcat的项目,没问题。所以这意味着 json 被正确解析并且它被添加到 myList.

myAdapter = new MyAdapter(getActivity(), getTheList());

将列表传递给自定义适配器的这一行;我不认为它是从 getTheList() 方法中获取列表的。因为我尝试通过将其放入 onCreateView 来使用以下代码进行调试,但它没有记录任何内容:

 for (int b = 0; b < getTheList().size(); b++) {
        Log.d("list: ", Integer.toString(b) + " : " + getTheList().get(b).getPlace());
    }

有人可以帮忙吗?我从昨天开始就一直在研究这个。

import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class ResultFrag extends Fragment implements  GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
double latitude, longitude;
String lat, lng;
private Bundle bundle;
private String data;
private static final String TAG_URL_DISTANCE = "///remove link///";
private static final String LOG_DISTANCE = ResultFrag.class.getSimpleName();
private MyAdapter myAdapter;
private RecyclerView recyclerView;
List<GetterSetter> myList = new ArrayList<>();
private static final String TAG = ResultFrag.class.getSimpleName();
private static final int REQUEST_CODE = 1000;
Location location;
GoogleApiClient googleClient;


public ResultFrag() {

}

public void searchPlace(final String dist, final String latitude, final String longitude) {

    StringRequest stringRequest = new StringRequest(Request.Method.POST, TAG_URL_DISTANCE, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.e(LOG_DISTANCE, response.toString());

            try {
                JSONArray arr = new JSONArray(response);
                for (int i = 0; i < arr.length(); i++) {
                    JSONObject obj = arr.getJSONObject(i);

                    GetterSetter getterSetter = new GetterSetter();
                    getterSetter.setId(obj.getString("id"));
                    getterSetter.setPlace(obj.getString("name"));
                    getterSetter.setDistance(obj.getInt("distance"));

                    myList.add(getterSetter);

                }
                for (int b = 0; b < getTheList().size(); b++) {
                    Log.d("list: ", Integer.toString(b) + " : " + getTheList().get(b).getPlace());
                }
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getContext(), "JSONException: " + e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }

    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(LOG_DISTANCE, "Volley Error: " + error.getMessage());
            Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show();
        }

    }) {

        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("dist", dist);
            params.put("latitude", latitude);
            params.put("longitude", longitude);
            return params;
        }
    };

    Volley.newRequestQueue(getContext()).add(stringRequest);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.result_frag, container, false);

    bundle = this.getArguments();
    data = bundle.getString(MainActivity.option);

    if (checkGooglePlayServices()) {
        buildGoogleClient();
    }

    lat = getLatitude();
    lng = getLongitude();
    Log.d("radius", data);
    Log.d("latitude", lat);
    Log.d("longitude", lng);

    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
    myAdapter = new MyAdapter(getActivity(), getTheList());
    recyclerView.setAdapter(myAdapter);

    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
   /* recyclerView.addOnItemTouchListener(
            new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {

                @Override
                public void onItemClick(View view, int position) {

                }
            })
    );*/
    return rootView;
}


private boolean checkGooglePlayServices() {
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getContext());
    if (resultCode != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
            // Show error
            GooglePlayServicesUtil.getErrorDialog(resultCode, getActivity(), REQUEST_CODE).show();
        } else {
            Toast.makeText(getContext(),
                    "No GPS",
                    Toast.LENGTH_LONG).show();

        }
        return false;
    }
    return true;
}

protected synchronized void buildGoogleClient() {
    googleClient = new GoogleApiClient.Builder(getActivity())
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}

@Override
public void onStart() {
    super.onStart();
    if (googleClient != null) {
        googleClient.connect();
    }
}

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


@Override
public void onConnected(Bundle bundle) {
    location = LocationServices.FusedLocationApi.getLastLocation(googleClient);
    searchPlace(data, getLatitude(), getLongitude());

    Toast.makeText(getContext(), getLatitude() + ", " + getLongitude(), Toast.LENGTH_LONG).show();
}

public List<GetterSetter> getTheList() {
    return myList;
}

public String getLatitude() {
    if (location != null) {
        latitude = location.getLatitude();
    }

    return String.valueOf(latitude);
}

public String getLongitude() {
    if (location != null) {
        longitude = location.getLongitude();
    }

    return String.valueOf(longitude);
}

@Override
public void onConnectionSuspended(int i) {
    googleClient.connect();
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = "
            + connectionResult.getErrorCode());
}
}

MyAdapter.class

    import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.Collections;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
List<GetterSetter> data = Collections.emptyList();
private LayoutInflater layoutInflater;
private Context context;

public MyAdapter (Context context, List<GetterSetter> data) {
    this.context = context;
    this.data = data;
    layoutInflater = layoutInflater.from(context);
}

@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = layoutInflater.inflate(R.layout.mylist, parent, false);
    MyViewHolder holder = new MyViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {
    // Get event data
    GetterSetter current = data.get(position);

    holder.id.setText(current.getId());
    holder.place.setText(current.getPlace());
    holder.distance.setText("Distance: " + String.valueOf(current.getDistance()) + " km");
}

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


public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView id;
    TextView place;
    TextView distance;

    public MyViewHolder(View itemView) {
        super(itemView);

        id = (TextView) itemView.findViewById(R.id.placeId);
        place = (TextView) itemView.findViewById(R.id.name);
        distance = (TextView) itemView.findViewById(R.id.distance);
    }

}
}

期间你修复了吗?我看到的是您实际上在适配器和片段之间共享列表。在构造适配器后,您对列表进行更改(添加项目)。但是您不会在适配器上调用 notfyDatasetChanged() 。完成对列表的应用更改后添加该调用。

           JSONArray arr = new JSONArray(response);
            for (int i = 0; i < arr.length(); i++) {
                JSONObject obj = arr.getJSONObject(i);

                GetterSetter getterSetter = new GetterSetter();
                getterSetter.setId(obj.getString("id"));
                getterSetter.setPlace(obj.getString("name"));
                getterSetter.setDistance(obj.getInt("distance"));

                myList.add(getterSetter);
            }
            myAdapter.notfyDatasetChanged()