1

我的活动中有一个 ListView。以下是我在 ListView 的行上设置 OnCLickListener 的方式

 listview.setAdapter(new RowsArrayAdapter(this, rows));

 listview.setOnItemClickListener(new OnItemClickListener() {
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         CheckedTextView ctv = (CheckedTextView) lv.getChildAt(position).findViewById(R.id.row_checkbox);
         ctv.setChecked(true);

 });

RowsArrayAdapter 的 getView() 方法如下:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

         LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

         View rowView = inflater.inflate(R.layout.row_layout, parent, false);

         CheckedTextView row = (CheckedTextView) rowView.findViewById(R.id.row_checkbox);
         row.setText(values[position].getRow_no());

         return rowView;
}

它适用于前 8 行。我检查了数组行的长度。它的 16 是正确的。但是当我向下滚动并单击某行(例如第 12 行)时,它会给我 NullPointerException。知道为什么会这样,我该如何解决。提前致谢。

4

3 回答 3

2

这产生空值:

CheckedTextView ctv = (CheckedTextView) lv.getChildAt(position).findViewById(R.id.row_checkbox);
ctv.setChecked(true);

但这不会:

CheckedTextView ctv = (CheckedTextView)  lv.getAdapter().getView(position, null,  lv).findViewById(R.id.row_checkbox);
ctv.setChecked(true);

请试试这个

于 2017-06-27T06:52:13.567 回答
0

你应该使用。

 CheckedTextView ctv = (CheckedTextView) view.findViewById(R.id.row_checkbox);
于 2013-09-30T14:14:04.850 回答
0

您不应将状态存储在行视图本身中。即使您能够找到正确的行并将复选框设置为选中状态,当您向后滚动时也会遇到问题。为了解决这个问题,我建议您在模型中添加检查标志并在适配器的 getView 方法中填充检查状态。在 onClick 侦听器中,您将需要修改您的模型并在您的适配器上 notifyDataSetChanged。

你不应该每次都在 getView 方法中膨胀同一个视图,否则你的性能会很差。仅当 convertView == null 时才应对其进行充气,否则只需重用转换视图。

我强烈建议您使用 RecyclerView 而不是 listview,因为它强制使用 ViewHolder 模式。在此处阅读更多信息:https ://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder

于 2017-06-27T07:39:01.977 回答