通过id从列表行内的文本视图中读取文本

时间:2014-07-30 15:10:41

标签: android android-listview

我有一个由我的数据库填充的列表。每个列表行都有一个文本视图和两个按钮。我想遍历所有列表行并检查列表中每个文本视图的文本,并根据读入的文本更改其中一个按钮背景。

这是我的代码:

Button fav, trash;
ListView lv;
TextView tv;
Cursor data;
CursorAdapter dataSource;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hs);


        tv = (TextView) this.findViewById(R.id.first);
        trash = (Button) this.findViewById(R.id.trashButton);
        fav = (Button) this.findViewById(R.id.favButton);



        data.moveToNext();

        dataSource = new SimpleCursorAdapter(this, R.layout.phrasebook, data,
                fields, new int[] { R.id.first}, 0);

        lv = (ListView) findViewById(R.id.list_view);

        lv.setAdapter(dataSource);

您可以看到列表由数据源和文本视图填充"首先"充满了弦乐。我想遍历每个列表行读取文本视图,然后根据文本的内容更改按钮背景。我的问题是如何获得文本视图和按钮的ID?

我读了并发现得到了孩子和父母,但不确定这是否正确。我想如果我可以通过id访问列表行然后访问它的孩子然后我可以这样做,但我不知道这是否可能。任何建议都表示赞赏。

我已经尝试过创建自定义适配器,我让它工作并且还找到了一种访问位置的方法,我希望利用它来访问文本视图。

公共类AdapterEx扩展了SimpleCursorAdapter {

private Context mContext;
private Context appContext;
private int layout;
private Cursor cr;
private final LayoutInflater inflater;
TextView tv;

public AdapterEx(Context context,int layout, Cursor c,String[] from,int[] to) {
    super(context,layout,c,from,to);
    this.layout=layout;
    this.mContext = context;
    this.inflater=LayoutInflater.from(context);
    this.cr=c;
}

@Override
public View newView (Context context, Cursor cursor, ViewGroup parent) {
        return inflater.inflate(layout, null);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    super.bindView(view, context, cursor);
     tv=(TextView)view.findViewById(R.id.first);
     if(cursor.getPosition()%2==1) {
         view.setBackgroundColor(Color.rgb(206, 43, 55));
          }
          else {
              view.setBackgroundColor(Color.rgb(0, 146, 70));
          }

}

}

2 个答案:

答案 0 :(得分:2)

以下是一个例子:

public class AdapterEx extends ArrayAdapter<String>
{

//You are going to pass a array of String, that you'll use at the textview.

Context context;
int resourceId;
ArrayList<String> tempStrings;

public AdapterEx ( Context context, int resourceId, ArrayList<String> tempStrings) 
{

    super( context, resourceId, tempStrings);

    this.context = context;
    this.resourceId = resourceId;
    this.tempStrings= tempStrings;

}

//In this class you'll declare everything that you'll use from your xml file, like        textview, buttons and etc.
private class ViewHolder
{

    TextView textViewsHere;

    Button buttonsHere;

}

@Override
public View getDropDownView(int position, View convertView,ViewGroup parent) 
{

    return getCustomView(position, convertView, parent);

}

@Override
public View getView( int position, View convertView, ViewGroup parent )
{

    return getCustomView(position, convertView, parent);

}

private View getCustomView( int position, View convertView, ViewGroup parent )
{

    View row = convertView;

    ViewHolder holder = null;

    if( row == null )
    {

        LayoutInflater mInflater = ( ( Activity ) context ).getLayoutInflater();
        row = mInflater.inflate( resourceId, parent, false );

        holder = new ViewHolder();

        //Now you are going to link from layout using your holder. Example:
        holder.textViewsHere = (TextView) row.findViewById( R.id.textViewsHere );

        row.setTag( holder );

    }else
    {

        holder = ( ViewHolder ) row.getTag();

    }

    //After doing the link between java code and xml.
    //You are going to set the value at the textView, buttons and whatever you want.
    //You pass to this class a arrayList<String> with the values that you want at the textview.

    String valueForTheTextView = tempStrings.get(position);

    holder.textViewsHere.setText( valueForTheTextView  );

    if( valueForTheTextView .equals("whatYouWantHere"))
    {

         button.changeTheButtonBackground(); //Example

    }

    return row;

}

}

要使用它,你可以使用其他类似的适配器 AdapterEx temp = new AdapterEx(activity.this,R.layout.YOUHAVETOCREATEYOURLAYOUT,theDataHere);

答案 1 :(得分:1)

我不同意Jonas452。如果您的数据来自数据库,那么强制将数据转换为ArrayList只是为了使用ArrayAdapter是没有意义的。这违背了CursorAdapter存在的目的。

Jonas452是正确的,你需要实现一个自定义视图(完全可以使用CursorAdapters)...但是它们的工作略有不同。这是一个很好的简单示例,展示并解释了如何使用SimpleCursorAdapter来完成Jonas452所讨论的内容:

Custom CursorAdapter

实现bindView()方法后,您将使用此方法将数据从光标实际分配到TextView中。因为您手头有数据,所以您可以选择如何在那里渲染按钮。 Cursor将始终位于正确的行位置以提取数据。那是因为将为列表中显示的每个项目调用bindView。传入的光标将始终表示该给定项的数据。因此,无论字符串存储在游标中的哪一列,都是用于确定如何处理按钮的字符串值。

@Override
public void bindView(View view, Context context, Cursor cursor) {
   tv=(TextView)view.findViewById(R.id.first);
   //...find your other views

   String text = cursor.getString(cursor.getColumnIndex("Your Column Name"));
   tv.setText(text);
   if (text.equals("test here")) {
       //...change button stuff
   } else {
       //...change button stuff
   }

   //....do whatever else you may need
}

附录,一旦你对此感到满意,我建议学习一下ViewHolder范例。对于任何自定义适配器,这是一种强烈推荐的方法。这是另一个证明与CursorAdapters一起使用的链接。