我试图在一个片段中使用自定义列表视图,并且尝试了很多事情,观看了视频,并在此站点中寻找解决方案,但由于它不起作用,我感到困惑。
我的问题是在代码中,我无法使自定义适配器生效,当片段膨胀时它崩溃,并且添加了“(AppCompatActivity)”后,它不会崩溃,但列表视图未显示任何内容。
有什么我可以做的吗?
我应该再尝试一件事吗?
这是我要使用ListView的片段
public class RecordFragment extends Fragment {
private ArrayList<Record> scoreList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_record, container, false);
scoreList= new ArrayList<>();
scoreList.add(new Record("Math", 10, "9/1/2017 13:45"));
scoreList.add(new Record("Math", 8, "7/5/2017 10:50"));
scoreList.add(new Record("Marh", 4, "7/7/2017 16:30"));
CustomAdapter adapter = new CustomAdapter(RecordFragment.this.getActivity(), android.R.layout.simple_list_item_1, scoreList);
ListView list1 = (ListView)view.findViewById(R.id.list1);
list1.setAdapter(adapter);
return view;
}
private class CustomAdapter extends ArrayAdapter<Record>{
AppCompatActivity appCompatActivity;
CustomAdapter(AppCompatActivity context){
super(context, R.layout.record_fragment, scoreList);
appCompatActivity = context;
}
public View getView(int position, View convertView, ViewGroup parent){
LayoutInflater inflater = appCompatActivity.getLayoutInflater();
View item = inflater.inflate(R.layout.record_fragment, null);
TextView tv1, tv2, tv3;
tv1 = (TextView)item.findViewById(R.id.tv1);
tv2 = (TextView)item.findViewById(R.id.tv2);
tv3 = (TextView)item.findViewById(R.id.tv3);
tv1.setText(scoreList.get(position).getTest());
tv2.setText(scoreList.get(position).getScore());
tv3.setText(scoreList.get(position).getDate());
return item;
}
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
}
这是具有每个ListView项的可视界面的XML
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="" />
<TextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="" />
<TextView
android:id="@+id/tv3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="" />
这是我创建的代表每个ListView项目的类
class Record{
private String test, date;
private int score;
public Record(String test, int score, String date)
{
this.test= test;
this.score= score;
this.date = date;
}
public String getTest() {
return test;
}
public int getScore(){
return score;
}
public String getDate(){
return date;
}
}
如果还有其他事情要告诉我,请告诉我。
事先谢谢你。
编辑:我修复了一些拼写错误。 Fragment中的这一行不会编译:
CustomAdapter adapter = new CustomAdapter(RecordFragment.this.getActivity(), android.R.layout.simple_list_item_1, scoreList);
当我尝试运行它时,将显示此消息(我的客人是错误日志):
Error:(39, 40) error: constructor CustomAdapter in class RecordFragment.CustomAdapter cannot be applied to given types;
必需:AppCompatActivity
找到:FragmentActivity,int,ArrayList
原因:实际和正式论点清单的长度不同
最佳答案
根据您的问题,您正面临这个问题
添加AppcompatActivity后,您的应用不会崩溃,但列表未显示任何内容
您的适配器正在从Activity中请求上下文,即AppCompat Type。因此,如果您的主机活动未扩展AppcompatActivity,它将崩溃
因此,当您将其更改为AppcompatActivity时,它不会崩溃
现在让我们解决显示空白listView的问题
您没有覆盖父方法getCount()
。在getCount()
方法中,返回列表中的size项。CustomAdapter adapter = new CustomAdapter(RecordFragment.this.getActivity(), android.R.layout.simple_list_item_1, scoreList);
另一件事我不认为您的代码可以用此行编译,因为您的AdaptadorHistorial(AppCompatActivity context){ super(context, R.layout.record_fragment, scoreList); appCompatActivity = context; }
自定义适配器采用一个参数,但是您要传递两个参数
您的构造函数应该是这样的
AdaptadorHistorial(Context context , List<Record> scoreList){
super(context, R.layout.record_fragment, scoreList);
this.context = context;
this.items = scoreList;
}
@override
public int getCount(){
return items.size();
}