gpt4 book ai didi

android - ListFragment 中的项目不会显示在使用自定义数组适配器的 Listview 中

转载 作者:行者123 更新时间:2023-11-29 17:49:18 26 4
gpt4 key购买 nike

我正在实现一个实现 ActionBar.TabListener 的 Fragment Activity ,因此我有 3 个选项卡,每个选项卡都有 ListFragments,其中有一个列表,其中填充了通过服务器获得的数据。我已经面对这个问题有一段时间了,无论我调查了多少关于这个特定问题的问题,或者我看了多少关于使用自定义数组适配器实现 ListFragments 的教程,我都找不到答案。

我遇到的问题是我无法让 Listview 上的数据显示在应用程序上。在将适配器设置为 ListView 之前,我已经设法通过服务器获取了填充自定义数组适配器所需的数据。我什至调试了代码,它说在调用将数组适配器设置为该 ListView 后,数据已填充到适配器和 ListView 中。然而,我无法让 Listview 中的数据显示在应用程序中。我已经研究这个问题一段时间了,我通过教程和论坛中发布的问题来寻找任何建议(甚至这个 one )来研究这个问题,但我还没有找到任何可以帮助我解决问题的东西。如果有人可以指出我做错了什么并提出解决此问题的建议,我将很乐意提供任何意见。

ListFragment Activity 的代码

public class MyJobsActivity extends ListFragment{

private ArrayList<Job> myJobs;

private static ListView listView;

private static ArrayList<Job> jobList;

ActionBar titleBar;

MyJobsActivity disAllList;


@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myJobs = (ArrayList<Job>) getArguments().getSerializable(Constants.MYJOBS);
jobList = new ArrayList<Job>();

Job datJob;
for(int i = 0; i < myJobs.size(); i++){
datJob = new Job();
datJob.setJobId(myJobs.get(i).getJobId());
datJob.setJobTitle(myJobs.get(i).getJobTitle());
datJob.setCompany(myJobs.get(i).getCompany());
datJob.setLocation(myJobs.get(i).getLocation());
jobList.add(datJob);
}
MyJobsAdapter datAdapter = new MyJobsAdapter(getActivity(), R.layout.job_row, jobList);
listView.setAdapter(datAdapter);

}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
try{
Intent datIntent = new Intent(getActivity(),JobActivity.class);
Job job = jobList.get(position);
datIntent.putExtra(Constants.JOBID, job.getJobId());
datIntent.putExtra(Constants.JOBTITLE, job.getJobTitle());
startActivity(datIntent);
}
catch(RuntimeException e){
e.printStackTrace();
}
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View rootView = inflater.inflate(R.layout.activity_my_jobs, container, false);
listView = (ListView) rootView.findViewById(android.R.id.list);

return rootView;
}


}

ListFragment Activity 的 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:background="#FFFFFF">

<ListView
android:id="@android:id/list"
android:drawSelectorOnTop="false"
android:tag="my_jobs"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_width="match_parent" />

</LinearLayout>

自定义数组适配器的代码

public class MyJobsAdapter extends ArrayAdapter<Job> {

private Activity activity;
private ArrayList<Job> data;
private HashMap<Integer, Boolean> selection;
private static LayoutInflater inflater=null;
private TextView jobPosition, company, location;
private CheckBox jobChecked;
private View actionView;
private int height, prevSize;
private ActionMode datMode;

public MyJobsAdapter(Activity a, int layoutResourceId, ArrayList<Job> jobs) {
super (a, layoutResourceId, jobs);
this.selection = new HashMap<Integer, Boolean>();
this.activity = a;
this.data = jobs;
}

private class ViewHolder {
TextView jobTitle;
TextView companyName;
TextView location;
}

/*public void setData(ArrayList<Job> d){
data = d;
if(data != null){
for (Job job : d){
add(job);
}
}
this.notifyDataSetChanged();
} */

public void setNewSelection(int position, boolean value){
prevSize = selection.size();
selection.put(position, value);
this.notifyDataSetChanged();
}

public boolean isPositionChecked(int position, boolean value){
boolean result = selection.get(position);
return result == true ? result : false;
}

public void removedSelection(int position){
prevSize = selection.size();
selection.remove(position);
this.notifyDataSetChanged();
}

public void clearSelection(){
prevSize = 0;
selection = new HashMap<Integer, Boolean>();
this.notifyDataSetChanged();
}


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


@Override
public long getItemId(int position) {
return position;
}

public void setMode(ActionMode mode){
datMode = mode;
}

public int getSelectedNumberOfItems(){
return selection.size();
}

public HashMap<Integer, Boolean> getSelectedList(){
return selection;
}

public ArrayList<Job> getData(){
return data;
}

public int getHeight(){
return height;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder jobHolder = null;
Job rowItem = getItem(position);
if(convertView==null){
convertView = inflater.inflate(R.layout.job_row, parent, false);
convertView.setBackgroundResource(R.drawable.list_selector);
jobHolder = new ViewHolder();
jobHolder.jobTitle = (TextView) convertView.findViewById(R.id.Position);
jobHolder.companyName = (TextView) convertView.findViewById(R.id.Company);
jobHolder.location = (TextView) convertView.findViewById(R.id.Location);
convertView.setTag(jobHolder);
} else{
jobHolder = (ViewHolder) convertView.getTag();
}
/* jobPosition = (TextView)vi.findViewById(R.id.Position);
company = (TextView)vi.findViewById(R.id.Company);
location = (TextView)vi.findViewById(R.id.Location);
jobChecked = (CheckBox)vi.findViewById(R.id.JobSelected);

jobChecked.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
StringBuilder lSelectedString = new StringBuilder(selection.size()).append(Constants.SELECTED);
if(isChecked){
setNewSelection(position,true);
datMode.setTitle(lSelectedString.toString());
}
else{
removedSelection(position);
datMode.setTitle(lSelectedString.toString());
if(selection.size() < 1)
datMode.finish();
}

}
});

if(selection.size() == 0){
jobChecked.setVisibility(View.GONE);
}
else{
jobChecked.setVisibility(View.VISIBLE);
jobChecked.setChecked(selection.get(position) == null ? false : true);
}

vi.setBackgroundResource(selection.get(position) == null ? color.white_color : color.holo_blue_bright);

*/

jobHolder.jobTitle.setText(rowItem.getJobTitle());
jobHolder.companyName.setText(rowItem.getCompany());
jobHolder.location.setText(rowItem.getLocation());

return convertView;

}

}

ListView 中每一行的代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/light_gray"
android:paddingTop="8dip"
android:paddingBottom="8dip"
android:descendantFocusability="blocksDescendants">

<RelativeLayout
android:id="@+id/JobRow"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<CheckBox
android:id="@+id/JobSelected"
android:layout_centerVertical ="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/Position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/dark_gray_position"
android:layout_toRightOf="@+id/JobSelected"
android:typeface="sans"
android:fontFamily="Roboto Regular"
android:textSize="22sp"
android:paddingLeft="4dip"/>

<TextView
android:id="@+id/Company"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@color/blue_company"
android:textSize="18sp"
android:fontFamily="Roboto Regular"
android:paddingLeft="4dip"
android:layout_below="@+id/Position"
android:layout_toRightOf="@+id/JobSelected"/>

<TextView
android:id="@+id/Location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/Company"
android:layout_toRightOf="@+id/JobSelected"
android:paddingBottom="8dip"
android:paddingLeft="4dip"
android:textColor="@color/steel_gray_location"
android:fontFamily="Roboto Regular"
android:textSize="14sp"/>

</RelativeLayout>

</RelativeLayout>

最佳答案

好吧,由于 MyJobsActivity 中的静态因素, fragment 生命周期可能会出现一些问题,但至于显示数据本身:

在您的 MyJobsActivity.onActivityCreated(或您最终将自定义适配器与底层 ListFragment 相关联的任何地方)中,您需要使用 setListAdapter 而不是 设置适配器

来自ListFragment文档(请参阅绑定(bind)到数据):

You must use ListFragment.setListAdapter() to associate the list with an adapter. Do not directly call ListView.setAdapter() or else important initialization will be skipped.

更清楚一点,使用/扩展 ListFragment 的众多好处之一是它将在内部处理自定义适配器和底层 ListView 之间的绑定(bind),但必须将适配器添加到 ListFragment 本身(即, setListAdapter), 不在 ListView 上。

其他一些观察:

事实上,除非您需要自定义布局,否则我建议您完全删除您对 onCreateView 的实现。这将允许 ListFragment 对其内部 ListView 使用其默认布局、初始化和处理,您还将(默认)处理空列表、加载进度条等。

鉴于您发布的代码,我建议不要在您的 MyJobsActivity 中使用私有(private) ListView 成员 - 它的父级 ListFragment 已经为您维护了底层 ListView 的副本,并且如果您通过 setListAdapter 正确设置了适配器,您不需要显式对象(如果需要,请使用 ListFragment 的 getListView())。

无论如何,如果我自己的试验和挑战有任何迹象,静态 ListView 和 ArrayList 成员肯定会在 fragment 被销毁和重新创建时引起您的悲伤(在方向更改时,从 Recents 列表恢复您的应用程序时,如果过程已在此期间被拆除等)。

关于android - ListFragment 中的项目不会显示在使用自定义数组适配器的 Listview 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com