我的目標是從適配器中提取三個JSON Objects
,並將它們顯示爲一個list item
中的三個文本視圖。它應該是這樣的,當只有一個本組對象: 單個列表項中未正確包含的視圖
相反,它顯示的:
我看不出什麼錯在我的XML或適配器。 (如下所示)什麼可以導致文本瀏覽器分裂成比所需的多的列表項目?
list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:padding="2dp"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="80dp"
android:layout_height="wrap_content"
android:id="@+id/outer"
android:padding="3dp"
android:background="#08445e"
android:layout_toLeftOf="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<TextView
android:id="@+id/textViewRoom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Room "
android:textColor="#fff"
android:layout_alignParentLeft="true"/>
<TextView
android:id="@+id/textViewTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Time: "
android:layout_alignParentRight="true"
android:textColor="#fff" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/inner"
android:background="#d1d1d1"
android:layout_below="@+id/outer"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/button"
android:layout_toStartOf="@+id/button">
<TextView
android:id="@+id/textViewRequest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:textColor="#000"
android:textSize="20sp"
android:layout_centerHorizontal="true" />
</RelativeLayout>
<Button
android:layout_width="60dp"
android:layout_height="60dp"
android:background="#dc2f2f"
android:id="@+id/button"
android:text="Mark Done"
android:textColor="#fff"
android:textAllCaps="false"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignBottom="@+id/inner"
android:layout_alignParentTop="true" />
</RelativeLayout>
MainAdapter.Java:
package com.example.duncan.recyclerviewproject;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainAdapter extends BaseAdapter {
SharedPreferences preferences;
Context context;
ArrayList<String> arraylist=new ArrayList<>();
public MainAdapter(Context context,
ArrayList<String>arrayList){
this.context=context;
this.arraylist=arrayList;
}
@Override
public int getCount() {
return arraylist.size();
}
@Override
public Object getItem(int i) {
return i;
}
@Override
public long getItemId(int i) {
return i;
}
public class ViewHolder{
Button mark_btn;
public TextView textViewRoom;
public TextView textViewRequest;
public TextView textViewTime;
}
@Override
public View getView(final int position, View row, ViewGroup parent) {
View convertView=row;
final ViewHolder holder;
if(convertView==null) {
holder=new ViewHolder();
LayoutInflater infalInflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.custom_layout, null);
holder.mark_btn= (Button) convertView.findViewById(R.id.button);
holder.textViewRoom = (TextView)
convertView.findViewById(R.id.textViewRoom);
holder.textViewRequest = (TextView)
convertView.findViewById(R.id.textViewRequest);
holder.textViewTime = (TextView)
convertView.findViewById(R.id.textViewTime);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.textViewRoom.setText(arraylist.get(position));
holder.textViewRequest.setText(arraylist.get(position));
holder.textViewTime.setText(arraylist.get(position));
holder.mark_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "Marked complete",
Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
}
MainActivity.java
package com.example.duncan.recyclerviewproject;
import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import me.anwarshahriar.calligrapher.Calligrapher;
public class MainActivity extends AppCompatActivity {
private static final String URL_DATA =
"https://summerproject17.herokuapp.com/api/request/?format=json";
private ListView recyclerView;
private MainAdapter adapter;
private ArrayList<String> listItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (ListView) findViewById(R.id.list);
/* recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));*/
//is the below line newly added?
listItems = new ArrayList<>();
loadRecyclerViewData();
Calligrapher calligrapher = new Calligrapher(this);
calligrapher.setFont(this, "elegantluxpro-mager.ttf", true);
}
private void loadRecyclerViewData(){
StringRequest stringRequest = new StringRequest(Request.Method.GET,
URL_DATA,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray array =
jsonObject.getJSONArray("results");
for(int i = 0; i < array.length(); i++){
JSONObject o = array.getJSONObject(i);
/* ListItem item = new ListItem(
o.getString("room"),
o.getString("request"),
o.getString("unixTime")
);*/
listItems.add(o.getString("room"));
listItems.add(o.getString("request"));
listItems.add(o.getString("room"));
}
Log.e("size",""+listItems.size());
adapter = new
MainAdapter(MainActivity.this,listItems);
recyclerView.setAdapter((ListAdapter) adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VOLLEY", error.getMessage());
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
activity_main.xml中列表視圖部分:
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list"
android:layout_below="@+id/relativeLayout2">
</ListView>
注:我問過類似的問題一個一週左右,但這是不同的因爲列表項目的結構已經改變,並且在這個問題上提供了更多細節。
嘗試'HashMap'。它會給你關鍵的價值對。 –