如何通过位置从ListView获取视图并将文本设置为项目?

时间:2014-12-02 04:40:43

标签: android listview

我正在尝试实现自定义列表。每行都有一个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,颜色更改等操作,这将非常有帮助。

2 个答案:

答案 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,请查看更多说明。