我有一个由我的数据库填充的列表。每个列表行都有一个文本视图和两个按钮。我想遍历所有列表行并检查列表中每个文本视图的文本,并根据读入的文本更改其中一个按钮背景。
这是我的代码:
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));
}
}
}
答案 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所讨论的内容:
实现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一起使用的链接。