我在20行的EditText和Checkbox中有一个ListView。EditText对前7行隐藏,然后对所有其他行可见。CheckBox对前7行可见,然后对其他行隐藏。onItemClick我已经给了toast以获取Edittext的文本,它可以很好地启动10行,但对于scrolling.The应用程序上的最后一行,它不会崩溃,从而导致NullPointerException错误
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder holder;
if(convertView==null){
/********** Inflate tabitem.xml file for each row ( Defined below ) ************/
vi = inflater.inflate(R.layout.tabitem, null);
/******** View Holder Object to contain tabitem.xml file elements ************/
holder=new ViewHolder();
holder.text=(TextView)vi.findViewById(R.id.textView1);
holder.check =(CheckBox)vi.findViewById(R.id.checkBox1);
holder.text2=(EditText)vi.findViewById(R.id.editText1);
/************ Set holder with LayoutInflater ************/
vi.setTag(holder);
j++;
if(j<8){
holder.text2.setVisibility(View.INVISIBLE);
holder.check.setX(-150);
}else
{
holder.check.setVisibility(View.INVISIBLE);
}
}
else
holder=(ViewHolder)vi.getTag();
holder.text2.getText();
if(data.size()<=0)
{
holder.text.setText("No Data");
holder.text2.getText();
// Log.v("BBBB", holder.text2.getText().toString());
}
else
{
/***** Get each Model object from Arraylist ********/
tempValues=null;
tempValues = (ListModel) data.get(position);
/************ Set Model values in Holder elements ***********/
holder.text.setText(tempValues.getCompanyName());
holder.text2.getText();
/******** Set Item Click Listner for LayoutInflater for each row ***********/
vi.setOnClickListener(new OnItemClickListener(position));
}
Log.v("DDD", holder.text2.getText().toString());
return vi;
}和
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}但是应用程序崩溃onITemClick method...Even EditText文本得到了错误的原因。
public void onItemClick(int mPosition)
{
View vListSortOrder;
vListSortOrder=list.getChildAt(mPosition);
Log.d("valueeeeeeee", Integer.toString(mPosition));
EditText edit=(EditText)vListSortOrder.findViewById(R.id.editText1);
String temp=edit.getText().toString();
}
public void onClick(View arg0) {
CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity; sct.onItemClick(mPosition); }上面的onItemClick可以很好地启动10行。但是在第11行,它会在EditText edit行上崩溃,并出现空指针异常错误。
逻辑猫
04-28 00:46:29.101: W/dalvikvm(2178): threadid=1: thread exiting with uncaught exception (group=0x41465700)
04-28 00:46:29.161: E/AndroidRuntime(2178): FATAL EXCEPTION: main
04-28 00:46:29.161: E/AndroidRuntime(2178): java.lang.NullPointerException
04-28 00:46:29.161: E/AndroidRuntime(2178): at com.androidexample.customlistview.CustomListViewAndroidExample.onItemClick(CustomListViewAndroidExample.java:172)
04-28 00:46:29.161: E/AndroidRuntime(2178): at com.androidexample.customlistview.CustomAdapter$OnItemClickListener.onClick(CustomAdapter.java:222)完整适配器代码
@SuppressLint("NewApi") public class CustomAdapter extends BaseAdapter implements OnClickListener {
/*********** Declare Used Variables *********/
private Activity activity;
private ArrayList data;
private static LayoutInflater inflater=null;
public Resources res;
ListModel tempValues=null;
int i=0;
int j=0;
public ArrayList<String> selectedStrings = new ArrayList<String>();
/************* CustomAdapter Constructor *****************/
public CustomAdapter(Activity a, ArrayList d,Resources resLocal) {
/********** Take passed values **********/
activity = a;
data=d;
res = resLocal;
/*********** Layout inflator to call external xml layout () **********************/
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
/******** What is the size of Passed Arraylist Size ************/
public int getCount() {
if(data.size()<=0)
return 1;
return data.size();
}
public Object getItem(int position) {
return data.get(position);
}
public long getItemId(int position) {
return 0;
}
/********* Create a holder to contain inflated xml file elements ***********/
public static class ViewHolder{
public TextView text;
public TextView text1;
public EditText text2;
public TextView textWide;
public ImageView image;
public CheckBox check;
}
/*********** Depends upon data size called for each row , Create each ListView row ***********/
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
final ViewHolder holder;
if(convertView==null){
/********** Inflate tabitem.xml file for each row ( Defined below ) ************/
vi = inflater.inflate(R.layout.tabitem, null);
/******** View Holder Object to contain tabitem.xml file elements ************/
holder=new ViewHolder();
holder.text=(TextView)vi.findViewById(R.id.textView1);
holder.check =(CheckBox)vi.findViewById(R.id.checkBox1);
holder.text2=(EditText)vi.findViewById(R.id.editText1);
holder.check.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v)
{
if (((CheckBox) v).isChecked())
{
holder.text2.setText("Checked");
}
else
{
holder.text2.setText("Not Checked");
}
}
});
/************ Set holder with LayoutInflater ************/
vi.setTag(holder);
j++;
if(j<8){
holder.text2.setVisibility(View.INVISIBLE);
holder.check.setX(-150);
holder.check.setVisibility(View.VISIBLE);
}else
{
holder.check.setVisibility(View.INVISIBLE);
holder.text2.setVisibility(View.VISIBLE);
}
}
else
holder=(ViewHolder)vi.getTag();
holder.text2.getText();
if(data.size()<=0)
{
holder.text.setText("No Data");
holder.text2.getText();
}
else
{
/***** Get each Model object from Arraylist ********/
tempValues=null;
tempValues = (ListModel) data.get(position);
/************ Set Model values in Holder elements ***********/
holder.text.setText(tempValues.getCompanyName());
/******** Set Item Click Listner for LayoutInflater for each row ***********/
vi.setOnClickListener(new OnItemClickListener(position));
}
return vi;
}
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public void onClick(View v) {
Log.v("CustomAdapter", "=====Row button clicked");
}
/********* Called when Item click in ListView ************/
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View arg0) {
CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity;
sct.onItemClick(mPosition);
}
} }
04-28 03:33:23.542: E/AndroidRuntime(4917): FATAL EXCEPTION: main
04-28 03:33:23.542: E/AndroidRuntime(4917): java.lang.NullPointerException
04-28 03:33:23.542: E/AndroidRuntime(4917): at com.androidexample.customlistview.CustomListViewAndroidExample$1.onClick(CustomListViewAndroidExample.java:89)
04-28 03:33:23.542: E/AndroidRuntime(4917): at android.view.View.performClick(View.java:4240)
04-28 03:33:23.542: E/AndroidRuntime(4917): at android.view.View$PerformClick.run(View.java:17721)
04-28 03:33:23.542: E/AndroidRuntime(4917): at android.os.Handler.handleCallback(Handler.java:730)发布于 2014-04-28 04:51:03
你写了令人困惑的代码。
将标记插入到text2上:
holder.text2.setTag(1);然后使用的下一行:
int position12 = (Integer)holder.text2.getTag();所以每次position12等于1。
下一步是使用j而不是位置。
您也需要更改可见性,就像下面的代码一样,因为ListView's recycling
if(j<8){
holder.text2.setVisibility(View.INVISIBLE);
holder.check.setVisibility(View.VISIBLE);
holder.check.setX(-150);
}else{
holder.text2.setVisibility(View.VISIBLE);
holder.check.setVisibility(View.INVISIBLE);
}因为有一个布局,所以要覆盖getViewTypeCount和getItemViewType
请从getView方法中删除以下行,
holder.text2.getText();和
Log.v("DDD", holder.text2.getText().toString());您的问题
你的问题是:
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View arg0) {
CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity;
sct.onItemClick(mPosition); <--- problem is here
}
} 我不知道你到底想要什么,但你能做到。
1-改变:
vi.setOnClickListener(new OnItemClickListener(position));至
vi.setOnClickListener(this);2-在getView方法中添加以下行:
holder.text.setTag(position);3-向onClick方法添加以下代码:
@Override
public void onClick(View v) {
TextView tv = (TextView)v.findViewById(R.id.textView1);
int pos = (Integer)tv.getTag();
Log.d("position of clicked item is", ""+pos);
}4-变化
if(j<8)至
if( position <8)发布于 2014-04-28 04:55:45
1.在扩展BaseAdapter时,始终要记住覆盖这三种方法:
@Override
public int getCount() {
return your_objects_list.size();
}
@Override
public YourObjectType getItem(int position) {
return your_objects_list.get(position);
}
@Override
public long getItemId(int position) {
// you could return any id related to your context, i just return 0 because I don't need it
return 0;
}2.摒弃这些方法:
你绝对不需要这些:
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}听着,让我解释一下你什么时候应该使用这些方法:
getViewTypeCount
此方法应返回您正在使用的不同布局文件的数量。例如,如果对行使用row_layout_1.xml和row_layout_2.xml文件,则getViewTypeCount()应该始终返回2。
因此,如果对所有行都使用单个.XML文件,则不应该重写此方法。
getItemViewType
当对单个列表项调用此方法时,应返回类型。在我前面提到的示例中,它应该根据项目的位置返回1或2。
由于您使用的是单个XML行类型,因此也不应该覆盖此方法。
告诉我你的结果。
3.不要使用j,而是使用position。
移动此代码,并在返回vi之前将其放置一行;
if(position <8){
holder.text2.setVisibility(View.INVISIBLE);
holder.check.setX(-150);
holder.check.setVisibility(View.VISIBLE);
}else
{
holder.check.setVisibility(View.INVISIBLE);
holder.text2.setVisibility(View.VISIBLE);
}告诉我你的结果。
https://stackoverflow.com/questions/23332615
复制相似问题