【问题标题】:Android: List not pass to RecyclerViewAndroid:列表不传递给 RecyclerView
【发布时间】:2015-10-30 17:50:12
【问题描述】:

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

json 返回是正确的。

我也尝试通过Logcat调试显示myList中的项目,没问题。这意味着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);
    }

}
}

【问题讨论】:

  • 你应该分享 MyAdapter 类的代码。
  • @HermannKlecker 我添加了 MyAdapter 类。
  • 而 for b 循环不会记录任何内容? response 长什么样子?
  • @HermannKlecker 当 b 循环在 onCreateView 内时,它不会记录任何内容。但是当它在 searchPLace() 方法中时,它确实记录了一些东西,这意味着 json 解析正在工作。只是它没有将列表传递给在onCreateView 中初始化的适配器。
  • 响应返回也是正确的。只是它没有将列表传递给适配器。我在想它与修饰符或其他东西有关。我不确定自己。

标签: android json google-maps android-volley


【解决方案1】:

您在此期间修复了吗?我看到的是您实际上在适配器和片段之间共享列表。并且您在构建适配器后对列表进行更改(添加项目)。但是您不要在适配器上调用 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()

【讨论】:

  • 经过几天的努力,终于解决了。我更改了一些代码并在我的适配器中添加了notifyDataSetChanged() 方法。它现在正在工作。谢谢。我会接受这个作为答案:)
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多