我正在尝试实现自定义列表。每行都有一个Textview,我想通过以下方式从onCreate将文本设置为那些TextView但是我得到了NullPointer异常。
我的自定义列表
public class CustomList extends ArrayAdapter<String>{
private final Activity context;
private final String[] web;
private final Integer[] imageId;
TextView txtTitle;
public CustomList(Activity context, String[] web, Integer[] imageId) {
super(context, R.layout.list_single, web);
this.context = context;
this.web = web;
this.imageId = imageId;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView= inflater.inflate(R.layout.list_single, null, true);
ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
txtTitle = (TextView) rowView.findViewById(R.id.txt);
txtTitle.setText(web[position]);
txtTitle.setText("Menjar Ali");
imageView.setImageResource(imageId[position]);
return rowView;
}
}
我的主要活动:
public class MainActivity extends Activity {
ListView list;
String[] web = {
"Google Plus",
"Twitter",
"Windows"
} ;
Integer[] imageId = {
R.drawable.ic_launcher,
R.drawable.ic_launcher,
R.drawable.ic_launcher
};
TextView myTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomList adapter = new CustomList(MainActivity.this, web, imageId);
list=(ListView)findViewById(R.id.list);
list.setAdapter(adapter);
View vv = list.getChildAt(0);
TextView tt = (TextView)vv.findViewById(R.id.txt);
tt.setText("momomo"); //Here I get the error
}
我的list_single.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TableRow>
<ImageView
android:id="@+id/img"
android:layout_width="50dp"
android:layout_height="50dp"/>
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="50dp" />
</TableRow>
</TableLayout>
实际上,我试图在scrollView中使用EditText而不是EditText来实现单行ListView,这样我就可以更好地滚动功能,并且在执行此操作时面临各种问题。
因此,如果我有一个精确的例子,可以从Main_activity中的任何地方访问EditText(在ListView内部)并有效地执行像setTet,getText,颜色更改等操作,这将非常有帮助。
答案 0 :(得分:1)
如果你想改变OnItemClick
ListView
vv
的颜色和值,那么custom adapter
的{{1}}为空,因为你传递的位置是错误的。
在txtTitle.setText("Menjar Ali");
评论此行web array
之前,因为您之前已为Menjar Ali
分配了值,并再次将该值设置为Menjar Ali
。因此,它会为每个行项显示public class MainActivity extends Activity {
ListView list;
String[] web = {
"Google Plus",
"Twitter",
"Windows"
} ;
Integer[] imageId = {
R.drawable.ic_launcher,
R.drawable.ic_launcher,
R.drawable.ic_launcher
};
TextView myTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomList adapter = new CustomList(MainActivity.this, web, imageId);
list=(ListView)findViewById(R.id.list);
list.setAdapter(adapter);
}
。
代码段
<强>活动强>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical" >
<ImageView
android:id="@+id/img"
android:layout_width="50dp"
android:layout_height="50dp"
android:adjustViewBounds="true"
android:cropToPadding="false"
android:scaleType="fitXY"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/txt"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="12dp"
android:text="text" />
</LinearLayout>
<强> list_single.xml 强>
public class CustomList extends ArrayAdapter<String>{
private final Activity context;
private final String[] web;
private final Integer[] imageId;
TextView txtTitle;
public CustomList(Activity context, String[] web, Integer[] imageId) {
super(context, R.layout.list_single, web);
this.context = context;
this.web = web;
this.imageId = imageId;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder viewHolder;
if(view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_single, parent, false);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) view.findViewById(R.id.img);
viewHolder.txtTitle = (TextView) view.findViewById(R.id.txt);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.txtTitle.setText(web[position]);
viewHolder.imageView.setImageResource(imageId[position]);
return view;
}
private class ViewHolder {
TextView txtTitle;
ImageView imageView;
}
}
<强>适配器强>
textColor
如果您想更改TextView
,可以在任何点击事件中更改,例如点击该OnItemClick
的{{1}}或ListView
。
如果要更改数据,您必须修改Web数组
中的这些值答案 1 :(得分:0)
要更新ListView项目值,您必须在适配器中设置其值,而不是onCreate of activity。
为了实现目标,您需要通过更新列表适配器中提供的对象数组来更新列表项,之后需要为适配器调用notifyDataSetChanges。
有关Android列表视图的好教程是定义here,请查看更多说明。