自定义列表视图中Imageview的空指针异常

时间:2015-10-09 11:55:23

标签: android android-listview nullpointerexception

我有一个带有TextView和三个ImageView的自定义列表视图。点击图片视图,我想开始一个新活动,并将特定位置的数据传递给下一个活动。但我得到空指针异常。

我已将此用于推介http://jmsliu.com/2444/click-button-in-listview-and-get-item-position.html

这是我的代码。这是主要的活动

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_employees);
    toolbar = (Toolbar) findViewById(R.id.app_bar);
    toolbar.setTitle("Manage Employees");
    nPregress = (ProgressBar) findViewById(R.id.toolbar_progress_bar);
    nPregress.setVisibility(View.GONE);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    mainList = (ListView) findViewById(R.id.manageemployeeList);

    employee1 = new ArrayList<Pojo>();
    tii = new ArrayList<String>();

    SharedPreferences prefs = getSharedPreferences("MyPref4", MODE_PRIVATE);
    Set<String> set1 = prefs.getStringSet("employeename", null);

    if (set1 != null ) {
        List<String> nameList = new ArrayList<String>(0);
        nameList.addAll(set1);


        for (int i = 0; i < set1.size(); i++) {
            pojo = new Pojo();
            pojo.setMgEmpName(nameList.get(i));
            employee1.add(pojo);
            Log.e("namemmee0", "" + nameList.get(i));
        }
        mainAdapter = new EmployeesAdapter(EmployeesActivity.this, employee1);
        mainList.setAdapter(mainAdapter);
    } else {
        new NetCheck().execute();
    }
    new NetCheck().execute();

    emp_edit = (ImageView) findViewById(R.id.imgedit);
    emp_edit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            View parentRow = (View) v.getParent();
            mainList = (ListView) parentRow.getParent();
            final int position = mainList.getPositionForView(parentRow);

            String emp_name = employee1.get(position).getMgEmpName().toString();

            Intent i = new Intent(EmployeesActivity.this, EditEmployee.class);
            i.putExtra("empname", emp_name);
            startActivity(i);
        }
    });


}

我在这一行得到例外

  emp_edit.setOnClickListener(new View.OnClickListener()

我该怎么做?请帮帮我。

这是我的适配器。我在adpter中尝试了onClickListener但是我没有在下一个活动中输入正确的数据..即使我选择不同的列表视图项我也得到相同的值

  public class EmployeesAdapter extends BaseAdapter {
TextView categoryName;
Pojo pojo;
private Context activity1;
ArrayList<Pojo> data1;
private ArrayList<Pojo> arraylist1 = null;
public static LayoutInflater inflater;

ImageView编辑,删除,历史;     String del_empid;

public EmployeesAdapter(Context ctx, ArrayList<Pojo> employee1) {
    // TODO Auto-generated constructor stub
    activity1 = ctx;
    data1 = employee1;
    inflater = (LayoutInflater) activity1
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.arraylist1 = new ArrayList<Pojo>();
    this.arraylist1.addAll(data1);
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return data1.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return data1.get(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View v = convertView;

    v = inflater.inflate(R.layout.manage_emp_list, parent, false);

    pojo = data1.get(position);

    categoryName = (TextView) v.findViewById(R.id.employeeName);
    categoryName.setText(pojo.getMgEmpName());
    edit = (ImageView) v.findViewById(R.id.imgedit);
    delete = (ImageView) v.findViewById(R.id.imgdelete);
    historyy = (ImageView) v.findViewById(R.id.imgHistory);
    edit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(activity1, EditEmployee.class);
            intent.putExtra("empname", "" + pojo.getMgEmpName());
            intent.putExtra("empmobile", "" + pojo.getMgEmpContact());
            intent.putExtra("empemail", "" + pojo.getMgEmpEmail());
            intent.putExtra("empappcost", "" + pojo.getMgEmpAppCost());

            activity1.startActivity(intent);
        }
    });

    delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            del_empid = pojo.getMgEmp_id();
            new NetCheck().execute();
        }
    });

    historyy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(activity1, MainActivity.class);
            activity1.startActivity(intent);
        }
    });
    return v;

}

自定义列表视图的manage_emp_list

<?xml version="1.0" encoding="utf-8"?>


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/employeeName"
    android:textColor="#000000"
    android:textSize="18dp"
    android:padding="5dp"
    android:layout_marginLeft="5dp"/>

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imgdelete"
    android:src="@drawable/delete32"
    android:layout_marginRight="12dp"
    android:layout_marginEnd="12dp"
    android:layout_alignBottom="@+id/employeeName"
    android:layout_toLeftOf="@+id/imgedit"
    android:layout_toStartOf="@+id/imgedit"
    android:clickable="true"
    android:onClick="delete_empoyee"/>

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imgedit"
    android:layout_marginRight="15dp"
    android:layout_marginEnd="15dp"
    android:src="@drawable/edit32"
    android:layout_alignTop="@+id/imgdelete"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:clickable="true"
   />

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imgHistory"
    android:src="@drawable/history32"
    android:clickable="true"
    android:onClick="employee_history"
    android:layout_alignParentTop="true"
    android:layout_toLeftOf="@+id/imgdelete"
    android:layout_toStartOf="@+id/imgdelete"
   />

2 个答案:

答案 0 :(得分:0)

试试这个,在本地存储时可能存在位置不匹配

edit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(activity1, EditEmployee.class);
        intent.putExtra("empname", "" + data1.get(position).getMgEmpName());
        intent.putExtra("empmobile", "" + data1.get(position).getMgEmpContact());
        intent.putExtra("empemail", "" + data1.get(position).getMgEmpEmail());
        intent.putExtra("empappcost", "" + data1.get(position).getMgEmpAppCost());

        activity1.startActivity(intent);
    }
});

答案 1 :(得分:0)

你的getView()方法应该在你的适配器中看起来像这样:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    pojo = data1.get(position);
    ViewHolder holder;

    if (pojo != null) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.manage_emp_list, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.categoryName.setText(pojo.getMgEmpName());

        //holder.edit.setOnClickListener()...

        //holder.delete.setOnclickListener()...


    }
    return convertView;
}

在适配器中添加静态类:

   static class ViewHolder {

    TextView categoryName;
    ImageView edit;
    ImageView delete;
    ImageView historyy;

    public ViewHolder(View view) {

        categoryName = (TextView) v.findViewById(R.id.employeeName);
        edit = (ImageView) v.findViewById(R.id.imgedit);
        delete = (ImageView) v.findViewById(R.id.imgdelete);
        historyy = (ImageView) v.findViewById(R.id.imgHistory);
    }
}