同一个arrayAdapter实例在两个ListView中不工作



我的Activity中有两个fragment。这两个片段都有唯一的listView,这些片段有从数据库获取值的方法,一个片段显示使用的数据,另一个显示添加的数据,所以我使用相同的模型。这些片段还使用了同一个arrayAdapter类的两个不同实例,该实例扩展了arrayAdapter <>

类FragmentPartTaken扩展Fragment

//Instance Variables
ListView listPartTaken;
AdapterPartsIntakenOutMinimized adapter;
private ArrayList<ModelPartIntakenOuttake> modelPartOuttakes;
//onCreateView     
listPartTaken = view.findViewById(R.id.list_part_taken);
modelPartOuttakes = new ArrayList<>();
adapter = new AdapterPartsIntakenOutMinimized(modelPartOuttakes,getContext());

类FragmentPartAdded扩展Fragment

//Instance Variables
ListView listPartAdded;
AdapterPartsIntakenOutMinimized adapter;
private ArrayList<ModelPartIntakenOuttake> modelPartAdded;
//onCreateView
listPartAdded = view.findViewById(R.id.list_part_added);
modelPartAdded = new ArrayList<>();
adapter = new AdapterPartsIntakenOutMinimized(modelPartAdded,getContext());

当活动启动时,在第一个片段中选择(显示)的列表是用数据填充的,而另一个列表是空白的。如果我改变这些片段的位置顺序,它会做同样的事情,第一个片段中的列表会被填充,但第二个片段不会。

arrayAdapter重写单个public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {}方法。我的问题是,我是否需要有每个片段与自己的适配器类和模型。因此,当活动启动时,可以一次填充所有内容。

编辑:

public class AdapterPartsIntakenOut extends ArrayAdapter<ModelPartIntakenOuttake> {
private ArrayList<ModelPartIntakenOuttake> dataSet;
Context mContext;
public AdapterPartsIntakenOut(ArrayList<ModelPartIntakenOuttake> data, Context context) {
super(context, R.layout.raw_intake_outake_parts, data);
this.dataSet = data;
this.mContext=context;
}
private static class ViewHolder {
TextView textAction;
TextView textDate;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ModelPartIntakenOuttake modelPartIntakenOuttake = getItem(position);
AdapterPartsIntakenOut.ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
if (convertView == null) {
viewHolder = new AdapterPartsIntakenOut.ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.raw_intake_outake_parts, parent, false);
viewHolder.textAction = (TextView) convertView.findViewById(R.id.txt_action_intake_outtake);
viewHolder.textDate = convertView.findViewById(R.id.txt_date_intake_outtake);
result=convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (AdapterPartsIntakenOut.ViewHolder) convertView.getTag();
result=convertView;
}
viewHolder.textAction.setText(modelPartIntakenOuttake.getActionType());
viewHolder.textDate.setText(modelPartIntakenOuttake.getOnDate());
return convertView;
}
}

编辑:我使用volley库来填充两个片段

中的适配器
private void getPartAdded(){
getActivity().runOnUiThread(mRunnable);
String partsTakenURL = "....";
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, partsTakenURL, null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i = 0; i < response.length(); i++) {
try { 
String actionType = response.getJSONObject(i).getString("action_type");
String onDate = response.getJSONObject(i).getString("on_date");
modelPartAdded.add(new ModelPartIntakenOuttake(actionType,onDate));
} catch (JSONException e) {
e.printStackTrace();
}
}
adapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(jsonArrayRequest);
listPartAdded.setAdapter(adapter);
}
Runnable mRunnable = new Runnable() {
public void run() {
modelPartAdded.clear();
adapter.notifyDataSetChanged();
}

也在另一个类

private void getPartOutTaken() {
getActivity().runOnUiThread(mRunnable);
String partsTakenURL = "...";
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, partsTakenURL, null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i = 0; i < response.length(); i++) {
try {
String actionType = response.getJSONObject(i).getString("action_type");                   
String onDate = response.getJSONObject(i).getString("on_date");
modelPartOuttakes.add(new ModelPartIntakenOuttake(actionType,onDate));
} catch (JSONException e) {
e.printStackTrace();
}
}
adapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(jsonArrayRequest);
listPartTaken.setAdapter(adapter);
}
Runnable mRunnable = new Runnable() {
public void run() {
modelPartOuttakes.clear();
adapter.notifyDataSetChanged();
}
};;

可以一次又一次地使用相同的适配器和模型类。您可能在填充数组列表时做错了什么。

最新更新