将自定义列表视图添加到片段

时间:2017-10-18 06:37:43

标签: java android

我正在尝试使用片段中的自定义列表视图,我尝试了很多东西,我观看了视频,并在此网站中寻找解决方案,但我感到困惑,因为它不起作用。 我的问题是,在代码中,我无法使自定义适配器工作,当片段膨胀时崩溃,并且添加了“(AppCompatActivity)”,它不会崩溃,但listview不会显示任何内容。 / p>

我能用这件事做点什么吗? 我应该尝试另外一件事吗?

这是我想要使用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;
  }
}

如果还有别的东西我必须告诉我,拜托。 事先,谢谢。

编辑:我修正了一些拼写错误。片段中的这一行不会编译:

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 原因:实际和正式的参数列表长度不同

1 个答案:

答案 0 :(得分:1)

根据您的问题,您正面临这个问题

  

添加AppcompatActivity后,您的应用不会崩溃,但列表没有显示任何内容

您的适配器要求您的活动中的上下文是AppCompat类型。因此,如果您的主机活动未扩展AppcompatActivity,它将崩溃

因此,当您将其更改为AppcompatActivity时,它不会崩溃

现在让我们解决显示空白listView的问题 你没有覆盖父方法getCount()。在列表中的getCount()方法返回大小项目中。

另一件事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();
}