【问题标题】:Activity Crash when Scroll Up Listview向上滚动列表视图时活动崩溃
【发布时间】:2017-04-25 05:57:17
【问题描述】:

Activity 由 ListView 组成,使用 volly 从服务器获取数据。

向下滚动 ListView 时,出现错误。

使用此代码将列表视图的最后一行设置为按钮:

 if (position == datamodel.size() - 1) 
    {
            convertView = inflater.inflate(R.layout.list_button, parent, false);
           TextView mytxt =(TextView)convertView.findViewById(R.id.txt_btn_more);

            mytxt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent myint = new Intent(context,Home.class);
                    editor.putString("btn_more_cliked","yes");
                    editor.commit();
                    myint.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(myint);

                }
    });

    return convertView;

ListView 向下滚动时工作正常,但向下滚动完成后ListView 再次向上滚动时出现错误。

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                                  at com.kachhua.blog.Home_ListAdapter.getView(Home_ListAdapter.java:92)
                                                                  at android.widget.AbsListView.obtainView(AbsListView.java:2346)
                                                                  at android.widget.ListView.makeAndAddView(ListView.java:1875)

在第 92 行我有这个代码

   title1.setText(m.getPost_title());

这是我的列表 adpater 的全部代码

public class Home_ListAdapter extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private List<DataModel_ListPost> datamodel;
public SharedPreferences pref;
public SharedPreferences.Editor editor;


public Home_ListAdapter(Context context, List<DataModel_ListPost> datamodel) {
    this.context = context;
    this.datamodel = datamodel;
}

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

@Override
public Object getItem(int position) {
    return datamodel.get(position);
}

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    pref = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
    editor = pref .edit();



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

    if(position == datamodel.size() - 1) // last element is a Button
    {

            convertView = inflater.inflate(R.layout.list_button, parent, false);
           TextView mytxt =(TextView)convertView.findViewById(R.id.txt_btn_more);

            mytxt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent myint = new Intent(context,Home.class);
                    editor.putString("btn_more_cliked","yes");
                    editor.commit();
                    myint.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(myint);

                }
            });

            return convertView;

    }
    else
    {


    if (convertView == null)
    {
        convertView = inflater.inflate(R.layout.single_row_home_listview, null);
    }
    else
    {
        TextView title1 = (TextView) convertView.findViewById(R.id.txt_title_text);
        TextView date =(TextView)convertView.findViewById(R.id.date_in_single_row);

        DataModel_ListPost m = datamodel.get(position);
        title1.setText(m.getPost_title());
        date.setText(m.getPost_date());




        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String id = datamodel.get(position).getPost_id();
                String title= datamodel.get(position).getPost_title();
                String content= datamodel.get(position).getPost_content();
                String link   = datamodel.get(position).getPost_url();
                String date = datamodel.get(position).getPost_date();
                String modified_date = datamodel.get(position).getPost_modified_date();

                editor.putString("id_from_list_adapter",id);
                editor.putString("title_from_list_adapter",title);
                editor.putString("content_from_list_adapter",content);
                editor.putString("post_url_from_list_adapter",link);
                editor.putString("post_date_from_list_adapter",date);
                editor.putString("post_modified_date_from_list_adapter",modified_date);
                editor.commit();

                Intent myint = new Intent(context,Post_Activivty.class);
                myint.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(myint);
            }
        });

    }

        return convertView;
    }

  }
}

这是我的列表视图的代码

     postlist=(ListView)findViewById(R.id.postList_home);
      adapter = new Home_ListAdapter(getApplicationContext(), datamodel);
            postlist.setAdapter(adapter);

【问题讨论】:

  • 该位置可能为空,为了保持它在您的Home_ListAdapter 中使用Holder,更多信息在这里:developer.android.com/training/improving-layouts/…
  • 检查数据天气是否为空,您获取的数据可能在该位置为空。
  • 我只是调试了一下,发现所有位置都有数据。

标签: android listview scroll listadapter


【解决方案1】:

请在这一行调试:

DataModel_ListPost m = datamodel.get(position);
title1.setText(m.getPost_title());

对于任何特定位置,m 都有可能为空。

【讨论】:

  • 我调试它,我得到了所有位置的数据。还有其他崩溃的原因吗
【解决方案2】:

请您尝试删除此条件

 if (convertView == null)
{
    convertView = inflater.inflate(R.layout.single_row_home_listview, null);
}
else
{
    TextView title1 = (TextView) convertView.findViewById(R.id.txt_title_text);
    TextView date =(TextView)convertView.findViewById(R.id.date_in_single_row);

并在每次初始化title1和日期TextViews之前初始化convertView。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多