Java setText()在适配器内不工作
我正在做一个Adroid应用程序来练习一点,但我在这里发现了一些问题。我有这个适配器来列出一些产品。我可以在活动中看到它们,但文本视图为空 您知道为什么setText()函数不起作用吗? 我认为这将是一个愚蠢的语法错误或类似的东西,但我不能找到它Java setText()在适配器内不工作,java,android,adapter,Java,Android,Adapter,我正在做一个Adroid应用程序来练习一点,但我在这里发现了一些问题。我有这个适配器来列出一些产品。我可以在活动中看到它们,但文本视图为空 您知道为什么setText()函数不起作用吗? 我认为这将是一个愚蠢的语法错误或类似的东西,但我不能找到它 public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> { private Cursor cursor; private boolean
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {
private Cursor cursor;
private boolean full;
public CardAdapter(Cursor c) {
cursor = c;
full = cursor.moveToFirst();
}
@Override
public CardAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.product_row, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
try {
if (full) {
String name = cursor.getString(cursor.getColumnIndex("name"));
holder.productName.setText(name);
full = cursor.moveToNext();
if(!full) cursor.close();
}
} catch (Exception e) {
Log.d("ADAPTER", "Error while trying to get rows from database");
}
}
@Override
public int getItemCount() {
int i = cursor.getCount();
if(i > 0) {
full = true;
return i;
}
else {
full = false;
return 0;
}
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView productName;
public ViewHolder(View v) {
super(v);
productName = ((TextView) v.findViewById(R.id.productName));
}
}
}
TextView xml:
<TextView
android:id="@+id/productName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#FFFFFF"
android:textSize="20sp"
android:textStyle="bold"
/>
解决方案
因为这也是我在这里发布的一条评论:textColor设置为白色。天才
谢谢大家! 您需要检查full是否为true,name是否为null。如果name为null或为空,则它将不设置任何其他内容,也不设置Textview上name变量中的任何内容。因此,请调试或添加日志以打印name中的值。适配器根据计数进行迭代,即
cursor.getCount()
。您可以使用其位置从索引中获取项。但在您的情况下,您必须迭代您自己的。否则,每次调用您的完整块时,都不会得到任何结果
尝试:-
在结束时,调用notifyItemPositionChanged()并传递相同的位置以刷新视图。尝试调试并检查完整值是否为真,名称是否正确。还有一个主要问题是,您没有正确循环它,请在实现所有游标对象的同时尝试执行。如果(cursor.moveToFirst()){do{String name=cursor.getString(cursor.getColumnIndex(“name”);}而(cursor.moveToNext());}cursor.close()@AnkitAman但是适配器使用getItemCount()通过onBindViewHolder自己迭代,不是吗?也许我把事情弄糊涂了。@AnkitAman在调试时也只在onBindViewHolder中输入一次,并正确地获取nameAdapter根据计数(cursor.getCount();)进行迭代。您可以使用其位置从索引中获取项。但在您的情况下,您必须迭代您自己的。否则,每次调用完整块时,都不会得到任何结果。它是在do内部或onBindViewHolder函数的末尾得到这样的名称吗?“这个。改变了(位置);'在关闭后的结束调用时更改(位置);试着调试并检查do while是否使用正确的输出。它正确地获取了名称,并且只迭代了一次,因为数据库中只有一行,所以它显然做得很好,但仍然没有显示您设置的文本颜色为的文本“#FFFFFF这是==白色只要改变颜色,它可能与您的背景色匹配。
<TextView
android:id="@+id/productName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#FFFFFF"
android:textSize="20sp"
android:textStyle="bold"
/>
pRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
pRecyclerView.setHasFixedSize(true);
pLayoutManager = new LinearLayoutManager(this);
productManager = new ProductManager(this);
Cursor c = productManager.getProducts();
pAdapter = new CardAdapter(c);
pRecyclerView.setAdapter(pAdapter);
pRecyclerView.setLayoutManager(pLayoutManager);
if(cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
}while (cursor.moveToNext());
}
cursor.close();