我有这个正在运行的Recyclerview但问题是,它没有填充任何东西。所以它是一个空白片段。我按照本教程了解如何做到这一点,我抽搐它以适应我自己。当然,它出了问题。
我正在关注的教程:http://androidcss.com/android/fetch-json-data-android/#comment-56
教程正在进行一个主要的活动asynctask适配器。我将其切换为片段asynctask和适配器。
public class AdapterProfile extends android.support.v7.widget.RecyclerView.Adapter<android.support.v7.widget.RecyclerView.ViewHolder>{
private android.content.Context context;
private android.view.LayoutInflater inflater;
java.util.List<Profile> data = java.util.Collections.emptyList();
com.example.admin.quoteme.Profile current;
int currentPos = 0;
public AdapterProfile(android.content.Context context, java.util.List<com.example.admin.quoteme.Profile> data){
this.context=context;
inflater= android.view.LayoutInflater.from(context);
this.data=data;
}
@Override
public android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup parent, int viewType){
android.view.View view = inflater.inflate(com.example.admin.quoteme.R.layout.feed_layout_v2, parent, false);
MyHolder holder = new com.example.admin.quoteme.AdapterProfile.MyHolder(view);
return holder;
}
@Override
public void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder holder, int position) {
// Get current position of item in recyclerview to bind data and assign values from list
MyHolder myHolder= (MyHolder) holder;
com.example.admin.quoteme.Profile current=data.get(position);
myHolder.name.setText(current.getUser_id());
myHolder.quote.setText(current.getQuote());
myHolder.points.setText(current.getQuote_points() + "Points");
// load image into imageview using glide
/*Glide.with(context).load("http://192.168.1.7/test/images/" + current.fishImage)
.placeholder(R.drawable.ic_img_error)
.error(R.drawable.ic_img_error)
.into(myHolder.ivFish);*/
}
@Override
public int getItemCount() {
return data.size();
}
class MyHolder extends android.support.v7.widget.RecyclerView.ViewHolder{
private android.widget.TextView name;
private android.widget.TextView quote;
private android.widget.TextView points;
// create constructor to get widget reference
public MyHolder(android.view.View itemView) {
super(itemView);
name = (android.widget.TextView)itemView.findViewById(com.example.admin.quoteme.R.id.name);
quote = (android.widget.TextView)itemView.findViewById(com.example.admin.quoteme.R.id.quote);
points = (android.widget.TextView)itemView.findViewById(com.example.admin.quoteme.R.id.points);
}
}
还有一些注释掉的代码是我过去的实验。请忽略已注释掉的内容。此外,我试图在asyncTask和onCreate中初始化适配器,两者都不起作用。我不知道。
我的适配器类。
if ( $data=~/<START>>/) {
print "\nFound start\n";
$message.=$data;
while ($message !~/END/){
$client_socket->recv($data, $message_length);
$message.=$data;
print "\nStill reading\n";
};
print "\nFound end\n"; # but may contain (part of) next START
}
我认为这两个课程足以消除错误。我很难尝试填充这个Recyclerview。
答案 0 :(得分:0)
在onCreateView中你有 - &gt; mAdapter = new AdapterProfile(getActivity(),data); 但数据只是空的变量。稍后在Async任务中,您将构建不使用的新本地数据变量。后执行中的注释块应该正常工作 - 日志中是否有错误消息?
答案 1 :(得分:0)
您正在AsyncTasks&#39;中填充数据ArrayList。 onPostExecute方法,但你永远不会将它设置为适配器......
取消注释适配器的创建并将其设置为recyclerview。为什么要注释掉?有错误吗?
答案 2 :(得分:0)
嘿,您的数据对象大小必须为null,因为看到您的代码
@Override
protected void onPostExecute(String result){
java.util.List<Profile> data = new java.util.ArrayList<>();
try {
org.json.JSONArray jArray = new org.json.JSONArray(result);
//extraction
for(int i= 0; i<jArray.length(); i++){
org.json.JSONObject json_data = jArray.getJSONObject(i);
Profile profile = new Profile();
profile.setUser_id(json_data.getString("user_id"));
profile.setQuote_points(json_data.getInt("quote_points"));
profile.setQuote(json_data.getString("quote_description"));
data.add(profile);
}
//setup and hand data over to rv // adapter
/*mRVProfile = (android.support.v7.widget.RecyclerView)llLayout.findViewById(com.example.admin.quoteme.R.id.recyclerViewGlobal);
mAdapter = new AdapterProfile(getActivity(), data);
mRVProfile.setAdapter(mAdapter);
mRVProfile.setLayoutManager(new android.support.v7.widget.LinearLayoutManager(getActivity()));*/
} catch (org.json.JSONException e){
android.widget.Toast.makeText(getActivity(),e.toString(), android.widget.Toast.LENGTH_LONG);
}
}
}
在这里,您将创建一个本地数据ArrayList。但是你设置了一个名为相同数据的不同列表到适配器,实例化但是没有大小。
您应该从onCreateView()
方法执行AssyncTask并从onPostExecute()
方法设置适配器。
*还要在Adapter中设置相同的数据变量。最好使它成为Fragment类的领域。